之前博客介绍郭试用JPA如何实现分页功能 但是 每次都要写sql语句去计算总条数countQuery 今天学习JPA文档的时候知道了Slice用法 于是进行了优化
之前文章连接
实现代码
public interface XDMReviewTimeDao extends JpaRepository<XDMReviewTimePoJo, Long> {
@Query(nativeQuery = true,
value = "select a.* , b.c_clientname as clientName , b.c_phone1 as clientPhone from XDM_Review_time a left join client_list b on a.c_clientid = b.id where a.c_appointment_day = ?1 ",
countQuery = "select count(*) from XDM_Review_time where c_appointment_day = ?1")
Page<List<Map<String, Object>>> findAllReviewsByDay(String day, Pageable pageable);
@Query(nativeQuery = true,
value = "select a.* , b.c_clientname as clientName , b.c_phone1 as clientPhone from XDM_Review_time a left join client_list b on a.c_clientid = b.id where a.c_clientid = ?1 ",
countQuery = "select count(*) from XDM_Review_time where c_clientid = ?1")
Page<List<Map<String, Object>>> findAllReviewsByClientId(String clientId, Pageable pageable);
@Query(nativeQuery = true,
value = "select a.* , b.c_clientname as clientName , b.c_phone1 as clientPhone from XDM_Review_time a left join client_list b on a.c_clientid = b.id where a.c_clientid = ?1 and a.c_appointment_day = ?2 ",
countQuery = "select count(*) from XDM_Review_time where c_clientid = ?1 and c_appointment_day = ?2 ")
Page<List<Map<String, Object>>> findAllReviewsByClientIdAndDay(String clientId, String day, Pageable pageable);
Long countByCCodeAndCSign(String code, String sign);
}
试用Slice替代Page接收返回值的方案
@Query(nativeQuery = true, value = "select a.* , b.c_clientname as clientName , b.c_phone1 as clientPhone from XDM_Review_time a left join client_list b on a.c_clientid = b.id where a.c_appointment_day = ?1 ")
Slice<List<Map<String, Object>>> findAllReviewsByDay(String day, Pageable pageable);
@Query(nativeQuery = true, value = "select a.* , b.c_clientname as clientName , b.c_phone1 as clientPhone from XDM_Review_time a left join client_list b on a.c_clientid = b.id where a.c_clientid = ?1 ")
Slice<List<Map<String, Object>>> findAllReviewsByClientId(String clientId, Pageable pageable);
@Query(nativeQuery = true, value = "select a.* , b.c_clientname as clientName , b.c_phone1 as clientPhone from XDM_Review_time a left join client_list b on a.c_clientid = b.id where a.c_clientid = ?1 and a.c_appointment_day = ?2 ")
Slice<List<Map<String, Object>>> findAllReviewsByClientIdAndDay(String clientId, String day, Pageable pageable);
相关介绍:
Page 知道可用的元素和页面的总数。它通过基础框架里面触发计数查询来计算总数。由于这可能是昂贵的,具体取决于所使用的场景,说白了,当用到 Pageable 的时候会默认执行一条 cout 语句。而 Slice 的作用是,只知道是否有下一个 Slice 可用,不会执行 count,所以当查询较大的结果集时,只知道数据是足够的就可以了,而且相关的业务场景也不用关心一共有多少页。