实体图

时间:2017-03-28 17:34:05

标签: spring-data-jpa querydsl entitygraph

我需要使用实体图与自定义查询结合使用分页。我的存储库看起来像这样:

@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很好,但我无法为实体图设置提示。

0 个答案:

没有答案