当前位置: 首页 > 面试题库 >

Hibernate-HQL分页

颛孙兴旺
2023-03-14
问题内容

我正在尝试使用HQL实现分页。我有一个PostgreSQL数据库。

int elementsPerBlock = 10;
int page = 2; //offset = 2*10

String html" target="_blank">sqlQuery = "FROM Messages AS msg " +
                  " LEFT JOIN FETCH msg.commands AS cmd " +   
                  "ORDER BY msg.identifier ASC" ;

Query query = session.createQuery( sqlQuery )
                     .setFirstResult( elementsPerBlock * ( (page-1) +1 ) )
                     .setMaxResults( elementsPerBlock );

发生的情况是,Hibernate提取所有消息,并在所有消息加载后返回所需的消息。

因此,Hibernate获取210000个实体,而不是返回的30个实体(每个Messages都有2个命令)。

有没有一种方法可以将开销减少7000倍?

编辑:我尝试添加 .setFetchSize( elementsPerBlock ) 。它没有帮助。

编辑2:生成的SQL查询是:

select ... 
from schemaName.messages messages0_ 
left outer join schemaName.send_commands commands1_ 
on messages0_.unique_key=commands1_.message_key 
order by messages0_.unique_identifier ASC

绝对没有LIMIT或OFFSET


问题答案:

根据JPA 2.0规范的第3.8.6节“查询执行”,

将setMaxResults或setFirstResult应用于涉及对集合进行提取联接的查询的效果是不确定的。

它随数据库的不同而变化,以我的经验,结果是Hibernate通常在内存中而不是在数据库查询级别上进行分页。

我通常所做的是使用一个单独的查询来获取所需对象的ID,然后通过访存联接将其传递到查询中。



 类似资料:
  • 现在只有这个语句“session.createquery(....)”大约需要105毫秒,这是用上面提到的老方法执行整个查询任务的10倍。 现在我不确定Hibernate查询缓存是如何工作的,但如果我第二次运行这个相同的HQL语句,大约需要5毫秒。 现在我的问题是为什么使用Hibernate HQL会发生这种行为?任何人都知道“session.createquery(...)”内部发生了什么方法,

  • 问题内容: 根据Hibernate文档的这一部分,我应该能够查询HQL中的任何Java类。 http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html#queryhql- polymorphism 不幸的是,当我运行此查询时… 我收到消息“ [未映射事务[从事务trans,其中trans.envelopeId =

  • 我有以下mysql查询: 我已经编辑了我的问题,以添加我正在使用的两个实体。第一个实体包含频率,我想要加入从另一个实体选择的项目。TFrequency表有一个不变的常量值。这个频率使用ID映射到tEXCELSMSTOSENDSchedule实体。但是,我希望从tfrequence中选择name,而不是映射的id。然后我用它来填充我的数据表。我需要创建第三个实体吗?我不知道这是如何工作的,我一直在尝

  • 我在Hibernate中有道传承,下面是代码: 用户DAO: 我有一个域类用户和两个子类用户:Customer和Sales。我有两个dao类,分别用于客户和销售。 用户DAO: 客户道: 销售DAO: 我的问题是,当我使用CusterDap调用方法getUserByUsername()(继承自BaseDaoImpl)与销售的用户名(拥有用户名的用户是SalesRep的实例,而不是客户)时,它会抛出

  • 如何在Hibernate中编写此SQL查询?我想使用Hibernate创建查询,而不是创建数据库。 我在SQLServer2008中创建了实体类, 我尝试用多种方法构建工作选择查询,但仍然不起作用。 也许实体有问题?