Hibernate Criteria分页

时间:2011-06-27 14:44:37

标签: java hibernate

JAVA hibernate中是否有办法执行条件查询,并且在一次访问数据库时,投影会依赖于同一个查询?

想要这样做的原因是获得最有效的页面搜索结果,我希望能够做到以下几点

start transaction 
   start db call
     do query()
     do count()
   end db call
end transaction

我目前正在做的是

start transaction 
   start db call
     do query()
   end db call
   start db call
     do count()
   end db call
end transaction

3 个答案:

答案 0 :(得分:1)

大约一年前我真的对此进行了调查,我想到的最好的是在同一个事务中执行两个数据库操作。它仍然是两个单独的数据库命中,但它消除了一些令人尴尬的标题,例如来自45的记录1-50。

答案 1 :(得分:1)

这是一个经典问题。简短的答案是否定的,因为您需要实际确定记录数,然后您只需要检索您想要的页面记录。我之前使用相同的Criteria查询完成了此操作,但执行以下操作:

  1. 设置完整的Criteria查询,但排序,限制和偏移
  2. 除外
  3. 向查询添加Projections.rowCount(),然后使用uniqueResult()
  4. 执行查询
  5. Projections设置为null
  6. 添加排序(addOrder),限制(setMaxResults)和偏移(setFirstResult
  7. 再次运行查询,这次使用list检索结果集
  8. 请注意,即使在Oracle中的存储过程中工作,我也见过有经验的DBA做同样的事情。

答案 2 :(得分:0)

问题是你甚至可以在SQL中制定这样的查询吗?你或许可以想出一些疯狂的联盟,将计数和结果的第一页结合在一起,但是我怀疑性能会比两个查询更好而且没有,hibernate没有办法为你自动映射这个