有谁知道HQL是否有关键字来识别ROWID或ROWNUM等行?
我想用HQL实现分页,但是我无法使用.setMaxResult()或.setFirstResult(),因为我不直接使用会话对象,因此不使用Query对象而只是创建我的查询一个字符串并使用.find()方法.
我在我的查询中尝试使用LIMIT和OFFSET,但是HQL似乎忽略了这些关键字并且无论如何都将整个结果返回给我.
我也无法使用Hibernate标准,因为它不支持我的查询中出现的"HAVING"子句.
我的最后一种方法是使用ROWNUM/ROWID关键字限制结果集.还有其他人有其他建议吗?
Hibernate分页问题
我有一个与Hibernate分页有关的问题,并且在某种程度上已经解释了这个问题
使用Hibernate的ScrollableResults慢慢读取9000万条记录
细节
来自应用程序的HQL查询:
Query q = session.createQuery("from RequestDao r order by r.id desc");
q.setFirstResult(0);
q.setMaxResults(50);
Run Code Online (Sandbox Code Playgroud)
查询返回300万条记录,对于分页,我们只设置了50条记录,分页页面非常慢,因为在每次刷新时我们都会调用查询来获取3百万条记录,而我们只设置50条记录.
我的主要问题是
HQL是否总是进入并命中数据库,或者它是否会进入会话或内存以查找数据,如果它每次都进入数据库并获得结果集那么从性能的角度来看它是非常合适的,什么是最好的解决方案来改进它?
在hibernate中使用HQL有一种方法可以查询数据库并首先获取50条记录,然后根据用户的要求获取其他记录.这个挑战真的让应用程序陷入困境,那么解决这个问题的最佳方法是什么呢?
在日志中生成的HQL查询
from com.delta.dao.RequestDao r order by r.id desc
Run Code Online (Sandbox Code Playgroud)
Hibernate生成的查询
select
getrequest0_.ID as ID24_,
getrequest0_.TIME as START3_24_,
getrequest0_.STAT as STATUS24_,
getrequest0_.SUM as SUMMARY24_,
getrequest0_.OUTNAME as OUTPUT7_24_,
getrequest0_.INPNAME as INPUT8_24_,
getrequest0_.REQUEST_DATE as requestT9_24_,
getrequest0_.PARENT_ID as PARENT10_24_,
getrequest0_.INTER_TYPE as INTERPO60_24_,
getrequest0_.OPEN_INT as OPEN61_24_,
getrequest0_.SOURCE_TYPE as SOURCE62_24_,
getrequest0_.TARGET_TYPE as TARGET20_24_,
getrequest0_.SOURCE as SOURCE14_24_,
getrequest0_.COPY_DATA as …Run Code Online (Sandbox Code Playgroud)