spring data jpa

xiaoxiao2021-02-28  46

1、准备工作

<dependencies> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId> <!--如果是spring boot就导spring-boot-starter-data-jpa--> <version>1.11.3.RELEASE</version> </dependency> </dependencies>

2、简单Dao层

public interface NewResourceRepository extends PagingAndSortingRepository<NewResource, Long>, JpaSpecificationExecutor<NewResource> { List<NewResource> findByIdIn(Collection<Long> ids); List<NewResource> findByRetryStatusAndOriginalCreateTimeNotNull(@Param("status") String status, Pageable pageable); @Query(nativeQuery = true, value = "SELECT id,credential,message_id,original_create_time,payload,resource_type,retry_status,soap_action,update_time,url,payloadc,id_np_val,id_type from cdr_resource where retry_status in :status and update_time<:updateTime LIMIT :limit OFFSET :offset") List<NewResource> findByRetryStatusInAndUpdateTimeBefore(@Param("status") List<String> status, @Param("updateTime") Date updateTime, @Param("limit") int limit, @Param("offset") int offset); }

a、定义接口继承相关接口,NewResource是表的实体类,主键是Long b、PagingAndSortingRepository(分页功能)等其他Repository子类

List<NewResource> findByRetryStatusAndOriginalCreateTimeNotNull(@Param("status") String status, Pageable pageable);

c、JpaSpecificationExecutor可以扩展查询条件

public final class ResourceSpecification implements Specification<NotStoredResource> { private final NotStoredResource resource; public ResourceSpecification(NotStoredResource resource) { this.resource = resource; } @Override public Predicate toPredicate(Root<NotStoredResource> root, CriteriaQuery<?> query, CriteriaBuilder cb) { List<Predicate> predicateList = Lists.newArrayList(); if (StringUtils.isNotBlank(resource.getMessageId())) predicateList.add(cb.equal(root.get("messageId").as(String.class), resource.getMessageId()));//相等 if (StringUtils.isNotBlank(resource.getPayload())) predicateList.add(cb.like(root.get("payload").as(String.class), "%" + resource.getPayload() + "%"));//模糊匹配 query.orderBy(cb.desc(root.get("originalCreateTime").as(Date.class)));//按某个字段降序排列 Predicate[] predicates = new Predicate[predicateList.size()]; return cb.and(predicateList.toArray(predicates)); } } >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Specification specification = new ResourceSpecification(final NewResource re); Page<NewResource> = newResourceRepository.findAll(specification, pageable);

3.用方法代替SQL语句

countByRetryStatusInAndUpdateTimeBefore(List status, Date updateTime)——retryStatus在集合内并且updateTime在某个时间前的数据记录条数

findByIdentifierNpValIsNullAndRetryStatusNotInAndOriginalCreateTimeNotNull(List nonRetry, Pageable pageable)——identifierNpVal为空,并且retryStatus不在集合内,并且originalCreateTime不为空

findFirstByResourceIdOrderByVersionDesc——通过resourceId查找并按version降序排列然后取第一条

4.基本原理

所有自定义xxxRepository接口里面的方法,最终都是通过SimpleJpaRepository去调用的hibernate接口实现的.如果这个实现类里面某些方法需要重定义,我们可以新建一个类继承它如叫CustomJpaRepository,然后覆写该方法即可。最后将其注入

public class CustomRepositoryFactoryBean<R extends JpaRepository<T, I>, T, I extends Serializable> extends JpaRepositoryFactoryBean<R, T, I> { @SuppressWarnings("rawtypes") protected RepositoryFactorySupport createRepositoryFactory(EntityManager em) { return new CustomRepositoryFactory(em); } private static class CustomRepositoryFactory<T, I extends Serializable> extends JpaRepositoryFactory { private final EntityManager em; public CustomRepositoryFactory(EntityManager em) { super(em); this.em = em; } protected Class<?> getRepositoryBaseClass(RepositoryMetadata metadata) { return CustomJpaRepository.class; } } } >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> @EnableJpaRepositories(repositoryFactoryBeanClass = CustomRepositoryFactoryBean.class) //在启动类(spring boot)加上这句注释即可
转载请注明原文地址: https://www.6miu.com/read-82514.html

最新回复(0)