我正在尝试使用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中创建了实体类, 我尝试用多种方法构建工作选择查询,但仍然不起作用。 也许实体有问题?