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)

无论如何,谢谢你