Jpa自定义条件分页查询
Jpa 分页查询有三种方法
- 新建继承
JpaRepository
的接口,并定义返回Page<T>
的方法 <S extends T> Page<S> findAll(Example<S> var1, Pageable var2);
Page<T> findAll(@Nullable Specification<T> var1, Pageable var2);
方案1
新建继承 JpaRepository
的接口,并定义返回 Page<T>
的方法
定义好方法后,直接调用即可,这种方法的优势就是可以自定义sql,当涉及连表操作时这种做法省事很多,但缺点也是需要自己编写sql,而且在实际情况中param的个数是不确定的,要么在SQL中判断param是否为空,要么定义多个分页查询方法,这另种做法都不太优雅
public interface MyRepository extends JpaRepository<YourEntity, Long>, JpaSpecificationExecutor<YourEntity> {
@Query("select .... from ... where ... param1=:param1 and pram2=:param2")
Page<T> find(String param1, String param2...., Pageable pageable)
}
方案2
<S extends T> Page<S> findAll(Example<S> var1, Pageable var2);
这种方法可以根据自己的意愿够着example,使用方法比较简单,缺点是无法满足比较大小类的查询,比如大于小于操作和in操作
repository.findAll(Example.of(example),pageable);
方案3
Page<T> findAll(@Nullable Specification<T> var1, Pageable var2);
这种方法比较万能,可以应对各种条件,代码编写量比较多,当依赖其他表的数据时需要分开查询,不能一步到位
Page<Alarm> alarms = alarmRepository.findAll((Specification<Alarm>) (root, query, cb) -> {
List