我需要使用实体图与自定义查询结合使用分页。我的存储库看起来像这样:
@Repository
public interface MaintenanceRepository extends JpaRepository<Maintenance, Long>, QueryDslPredicateExecutor<Maintenance> {
@EntityGraph(value = "Maintenance.Graph")
@Query("select m from Maintenance m where m.detail.type.company = ?1 ")
Page<Maintenance> findWithCompany(Company company, Pageable pageable);
}
为了进行比较,我使用此方法并使用从findAll
继承的QueryDslPredicateExecutor
方法获取维护:
...
Pageable pageable = new PageRequest(pageNumber, pageSize, Sort.Direction.DESC, "creationTime");
Page<Maintenance> page = repo.findWithCompany(company, pageable);
Page<Maintenance> page2 = repo.findAll(QMaintenance.maintenance.detail.type.company.eq(company), pageable);
LOGGER.debug("Old: {} - {}, New: {} - {}", page.getTotalElements(), page.getContent().size(), page2.getTotalElements(), page2.getContent().size());
...
在数据库中有3个维护寄存器,当我使用页面大小为1,2和50的页面调用此方法时,我会得到此日志。
[28/03/2017 14:14:36] [DEBUG] Old: 3 - 1, New: 3 - 1 //total - content
[28/03/2017 14:15:09] [DEBUG] Old: 3 - 2, New: 3 - 2
[28/03/2017 14:15:27] [DEBUG] Old: 3 - 3, New: 3 - 3
根据日志,分页工作正常,但是当我使用我的存储库方法和继承的findAll
方法时,查询非常不同。
//Query for my repository method
Hibernate: select ... where maintenanc0_.detalle=detail1_.id and detail1_.tipo=type2_.id and type2_.compania=? order by maintenanc0_.fecha desc
//Query for inherited `findAll` method
Hibernate: select ... where maintenanc0_.detalle=detail1_.id and detail1_.tipo=type2_.id and type2_.compania=? order by maintenanc0_.fecha desc limit ?
已经剪切了两个日志以显示相关信息,而在第二个查询中,实体图形提示尚未使用,因为我无法为其提供Predicate对象,但我理解并且这不是我的问题。
有了这个结果,我理解使用我的存储库方法(第一个查询)我没有得到真正的分页,因为spring填充了具有正确内容大小的列表,并且查询没有{{1} } keyword。
通过第二个查询,我得到了真正的分页,因为数据库正在进行工作。
根据Spring Data reference我应该可以使用自定义查询方法进行分页。
我关心的是性能,因为我不想在内存中加载大量数据,我需要在数据库级别完成真正的分页。
使用limit
很好,但我无法为实体图设置提示。