SpringData Jpa实现分页功能 实现方式二 试用Slice接收

之前博客介绍郭试用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,所以当查询较大的结果集时,只知道数据是足够的就可以了,而且相关的业务场景也不用关心一共有多少页。

发布了200 篇原创文章 · 获赞 97 · 访问量 59万+

猜你喜欢

转载自blog.csdn.net/u010838785/article/details/103890301