spring jpa分页条件查询(常用三种方式)总结。

时间:2025-02-12 08:19:34

spring jpa分页条件查询(常用三种方式)

    • 一、直接传递参数方式
      • 1. PagingAndSortingRepository
      • 2. @Query
    • 二、Specification
    • 三、 Example 和 ExampleMatcher
  • 总结

  开发中,如果是使用Spring全家桶进行开发的话,Spring Data JPA分页条件查询就会经常被用到,所以下面介绍一下jpa分页条件查询常用的三种开发方式。

一、直接传递参数方式

1. PagingAndSortingRepository

  使用PagingAndSortingRepository 的Repository接口,并在方法名上使用约定的命名规则来定义查询方法。Spring Data JPA会根据方法名自动生成查询语句,并支持分页和排序。代码如下:

public interface UserRepository extends PagingAndSortingRepository<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 对象来指定分页信息。例如:

public interface UserRepository extends JpaRepository<User, Long> {
    @Query("SELECT u FROM User u WHERE  = :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接口。
代码如下:


public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
    Page<User> findAll(Specification<User> spec, Pageable pageable);
}

public class UserService {
    @Autowired
    private UserRepository userRepository;

    public Page<User> findByAgeAndGender(int age, String gender, int pageNumber, int pageSize) {
        Specification<User> spec = (root, query, criteriaBuilder) -> {
            List<Predicate> predicates = new ArrayList<>();
            predicates.add(criteriaBuilder.equal(root.get("age"), age));
            predicates.add(criteriaBuilder.equal(root.get("gender"), gender));
            return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
        };

        Pageable pageable = PageRequest.of(pageNumber, pageSize, Sort.by("id").descending());
        return userRepository.findAll(spec, pageable);
    }
}



三、 Example 和 ExampleMatcher

  Example 是Spring Data JPA提供的一种用于封装查询条件的对象,可以根据实体对象的属性值进行查询。 ExampleMatcher 用于定义查询条件的匹配规则,使用它们也可以实现分页条件查询。
代码如下:

public interface UserRepository extends JpaRepository<User, Long> {
    Page<User> findAll(Example<User> example, Pageable pageable);
}

public class UserService {
    @Autowired
    private UserRepository userRepository;

    public Page<User> findByExample(String name, int age, int pageNumber, int pageSize) {
        User user = new User();
        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 分页查询方式(两种)!!!