Spring数据分页性能
嗯,这很烦人,我真的不知道如何解决这个问题,所以事情是这样的 获取了一个返回分页数据的应用程序,如下所示:Spring数据分页性能,spring,spring-boot,spring-data-jpa,spring-data,Spring,Spring Boot,Spring Data Jpa,Spring Data,嗯,这很烦人,我真的不知道如何解决这个问题,所以事情是这样的 获取了一个返回分页数据的应用程序,如下所示: @Query(value="SELECT DD FROM Document DD " + " WHERE DD.deletedByUsr IS NULL " + " AND DD.deleteTime IS NULL " + " AND DD.version = (SELECT MAX(D.version) FROM Document D
@Query(value="SELECT DD FROM Document DD "
+ " WHERE DD.deletedByUsr IS NULL "
+ " AND DD.deleteTime IS NULL "
+ " AND DD.version = (SELECT MAX(D.version) FROM Document D WHERE D.code = DD.code AND D.status = :status AND DD.status =:status)")
public Page<Document> getLatestByStatus(@Param("status") DocumentStatus status, Pageable pageable);
Pageable pageable = PageRequest.of(0, 5, Sort.by(Sort.Direction.ASC, "id"));
Page<Document> latestByStatus = repository.getLatestByStatus(DocumentStatus.APPROVED, pageable);
并按如下方式调用存储库:
@Query(value="SELECT DD FROM Document DD "
+ " WHERE DD.deletedByUsr IS NULL "
+ " AND DD.deleteTime IS NULL "
+ " AND DD.version = (SELECT MAX(D.version) FROM Document D WHERE D.code = DD.code AND D.status = :status AND DD.status =:status)")
public Page<Document> getLatestByStatus(@Param("status") DocumentStatus status, Pageable pageable);
Pageable pageable = PageRequest.of(0, 5, Sort.by(Sort.Direction.ASC, "id"));
Page<Document> latestByStatus = repository.getLatestByStatus(DocumentStatus.APPROVED, pageable);
而且,结果马上就会出来
我假设,关于第一种情况,它需要永远,Spring首先检索所有数据(没有限制行),然后返回一个包含结果数量的页面
不知道@Query
注释是否有问题
顺便说一下,我正在使用2.3.0.0版本的Spring启动版
不管怎么说,为什么一个永远需要检索数据,而另一个却需要立即检索数据
你们有办法解决这个问题吗?
也许有一种在@query注释上编写查询的最佳方法
提前感谢。经过几次调试和记录后,我发现Spring数据确实在hibernate生成的查询中添加了分页(偏移量0行只取下5行),所以主要问题是@query annotation上的SQL查询 我改为:
@Query(value="SELECT DD FROM Document DD "
+ " WHERE DD.deletedByUsr IS NULL "
+ " AND DD.deleteTime IS NULL "
+ " AND DD.status =:status "
+ " AND DD.version = (SELECT MAX(D.version) FROM Document D WHERE D.code = DD.code AND D.status = :status AND D.deleteTime IS NULL AND D.deletedByUsr IS NULL )")
(已添加DD.status=:status和D.deletedByUsr在内部查询中为NULL,D.deleteTime为NULL)
无论如何,谢谢你