【问题标题】:Retrieve specific number of records from database - JPA (Impove performance)从数据库中检索特定数量的记录 - JPA(提高性能)
【发布时间】:2015-11-28 22:14:43
【问题描述】:

我在互联网上找到了几种解决方案,但在性能方面,这些不是我搜索的。我有一个记录超过 10,000,000 条记录的表。我需要只读取最后 150 个结果

query.select(trailRoot).distinct(Boolean.TRUE)
    .where(buildPredicateForAuditTrail(auditTrailCriteria, criteriaBuilder, trailRoot));

final TypedQuery<AuditTrail> typedQuery = entityManager.createQuery(query);
return typedQuery.setFirstResult(auditTrailCriteria.calculateFirstResultIndex())
    .setMaxResults(150).getResultList();

这段代码完成了这项工作。但它仍然从 db 中读取所有 10,000,000 条记录这使得 Web 服务器超载。我可以简单地限制查询吗,

SELECT *FROM Persons LIMIT 5;

有没有办法通过查询本身来限制结果? 非常感谢任何帮助。

谢谢。

【问题讨论】:

  • 你可以试试SELECT TOP 150 * FROM Persons ORDER BY ID DESC
  • @saviNuclear 你的意思是命名查询??
  • LIMIT 显然不是 JPQL 关键字,“*”也不是有效的......请参阅任何 JPQL 参考。 MaxResults/FirstResult 是您为 JPQL 设置的

标签: java hibernate jpa spring-data-jpa persistence


【解决方案1】:

为什么不能将第一个结果设置为特定的偏移量?

query.setFirstResult(firstResult);
query.setMaxResults(maxResults);

看看 LazyCarDataModel.java http://www.primefaces.org/showcase/ui/data/datatable/lazy.xhtml

【讨论】:

  • 感谢您的回复。我当然可以。设置最大结果就可以了。但我的问题是查询仍然从数据库中读取所有 10,000,000 条记录,然后限制结果集。这就是我想要摆脱的peocess。我想通过查询本身来限制结果。
  • 1.如果您想通过查询本身限制结果,恐怕您必须在 where 子句中添加一些条件...... 2. 在我描述的情况下(您选择一部分)JPA 将发送查询包括对底层 DBMS 的 OFFSET 和 LIMIT。 So when the select is slow JPA/Hibernate are not to blame ;)
  • JPA 在构建 SQL 查询时直接使用 setFirstResult 和 setMaxResults,通常 LIMIT 关键字与传递给 MaxResults 的值一起使用,但这取决于数据库类型和 JPA 提供程序设置。您确定 JPA 查询检索所有记录而不仅仅是 maxResults 记录吗?如果是,请写下你的数据库是什么(MySQL?)? Hibernate 应该为您的数据库配置正确的方言,以便正确构建查询。
猜你喜欢
  • 1970-01-01
  • 2013-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多