在Spring JPA中,分页条件查询可以通过以下三种常见方式实现:
- 使用Spring Data JPA提供的Pageable接口。
- 使用JpaRepository接口中的Slice类型返回结果。
- 手动编写JPQL或者Criteria API查询。
以下是每种方式的示例代码:
- 使用Pageable接口:
public interface UserRepository extends JpaRepository<User, Long> {
    Page<User> findByName(String name, Pageable pageable);
}
 
// 使用示例
Pageable pageable = PageRequest.of(page, size);
Page<User> users = userRepository.findByName("John", pageable);
- 使用Slice类型返回结果:
public interface UserRepository extends JpaRepository<User, Long> {
    Slice<User> findByName(String name, Pageable pageable);
}
 
// 使用示例
Pageable pageable = PageRequest.of(page, size);
Slice<User> users = userRepository.findByName("John", pageable);
- 手动编写JPQL查询:
@Repository
public class UserRepositoryImpl implements UserRepositoryCustom {
 
    @PersistenceContext
    private EntityManager entityManager;
 
    @Override
    public List<User> findByNameWithNativeQuery(String name, int page, int size) {
        Query query = entityManager.createQuery("SELECT u FROM User u WHERE u.name = :name", User.class)
                .setParameter("name", name)
                .setFirstResult((page - 1) * size)
                .setMaxResults(size);
 
        return query.getResultList();
    }
}
 
// 使用示例
List<User> users = userRepository.findByNameWithNativeQuery("John", 1, 10);
在实际应用中,可以根据需要选择合适的方式进行分页查询。Pageable和Slice提供了基于偏移的分页,而手动编写JPQL查询则可以提供更多的灵活性和性能优化空间。