spring jpa分页条件查询(常用三种方式)
开发中,如果是使用Spring全家桶进行开发的话,Spring Data JPA分页条件查询就会经常被用到,所以下面介绍一下jpa分页条件查询常用的三种开发方式。
一、直接传递参数方式
1. PagingAndSortingRepository
使用PagingAndSortingRepository 的Repository接口,并在方法名上使用约定的命名规则来定义查询方法。Spring Data JPA会根据方法名自动生成查询语句,并支持分页和排序。代码如下:
publicinterfaceUserRepositoryextendsPagingAndSortingRepository<User,Long>{Page<User>findByAge(int age,Pageable pageable);}
在Service层中可以使用
Pageable
对象来指定分页信息,然后调用Repository中定义的方法进行查询,代码如下:
Pageable pageable =PageRequest.of(pageNumber, pageSize,Sort.by("id").descending());Page<User> users = userRepository.findByAge(30, pageable);
2. @Query
@Query
注解自定义查询方法,这种方式适合需要更复杂的查询逻辑,使用 @Query 注解在Repository接口中自定义查询方法。通过编写JPQL查询语句或者使用原生SQL查询,在查询方法中,直接使用
Pageable
对象来指定分页信息。例如:
publicinterfaceUserRepositoryextendsJpaRepository<User,Long>{@Query("SELECT u FROM User u WHERE u.age = :age")Page<User>findByAge(@Param("age")int age,Pageable pageable);}
在Service层中,就可以调用自定义的查询方法,并传入
Pageable
对象来实现分页查询,代码如下:
Pageable pageable =PageRequest.of(pageNumber, pageSize,Sort.by("id").descending());Page<User> users = userRepository.findByAge(30, pageable);
二、Specification
Specification
是Spring Data JPA提供的一种用于构建动态查询条件的接口,可以根据不同的条件动态组合查询条件,自定义的UserRepository 必须实现
JpaSpecificationExecutor
接口。
代码如下:
publicinterfaceUserRepositoryextendsJpaRepository<User,Long>,JpaSpecificationExecutor<User>{Page<User>findAll(Specification<User> spec,Pageable pageable);}publicclassUserService{@AutowiredprivateUserRepository userRepository;publicPage<User>findByAgeAndGender(int age,String gender,int pageNumber,int pageSize){Specification<User> spec =(root, query, criteriaBuilder)->{List<Predicate> predicates =newArrayList<>();
predicates.add(criteriaBuilder.equal(root.get("age"), age));
predicates.add(criteriaBuilder.equal(root.get("gender"), gender));return criteriaBuilder.and(predicates.toArray(newPredicate[0]));};Pageable pageable =PageRequest.of(pageNumber, pageSize,Sort.by("id").descending());return userRepository.findAll(spec, pageable);}}
三、 Example 和 ExampleMatcher
Example
是Spring Data JPA提供的一种用于封装查询条件的对象,可以根据实体对象的属性值进行查询。
ExampleMatcher
用于定义查询条件的匹配规则,使用它们也可以实现分页条件查询。
代码如下:
publicinterfaceUserRepositoryextendsJpaRepository<User,Long>{Page<User>findAll(Example<User> example,Pageable pageable);}publicclassUserService{@AutowiredprivateUserRepository userRepository;publicPage<User>findByExample(String name,int age,int pageNumber,int pageSize){User user =newUser();
user.setName(name);
user.setAge(age);ExampleMatcher matcher =ExampleMatcher.matching().withIgnoreCase().withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING);Example<User> example =Example.of(user, matcher);Pageable pageable =PageRequest.of(pageNumber, pageSize,Sort.by("id").descending());return userRepository.findAll(example, pageable);}}
总结
以上三种方式都可以实现基于Spring Data JPA的
分页查询,并根据条件进行筛选。
希望对看到本文的你有帮助。
上一篇 SpringBoot整合SpringDataJPA实现增删改查(详细版)。
记得点赞收藏哦!!!
下一篇 springboot jpa 分页查询方式(两种)!!!
版权归原作者 程序员阿皓 所有, 如有侵权,请联系我们删除。