从Hibernate中查找结果

时间:2012-06-07 09:51:09

标签: java sql hibernate jpa

我正在对来自hibernate的一组结果实现分页。目前我在做

long count = getCountResultForNamedQuery();
List result = getResultForNamedQuery()

这两个查询类似于

select count(*) from addresses where country = 'USA';

select * from addresses where country = 'USA';

对于分页,我通常更新getResultForQuery,以便设置.setFirstResult和setMaxResult。这将只返回我想要的部分。我必须做一个计数,以便知道在页面的分页部分显示多少页面。

我想知道我是否能更有效率。我可以做吗

List result = getResultForQuery();
int count = result.size();
List subResult = result.subList(start, end);

这有意义吗?我试图只在可能的情况下调用一个查询。问题是hibernate有多聪明?当我调用size时它会计算它返回的对象shell还是尝试解析所有内容然后点击数据库?哪种模式更好?

如果示例不够明确,请道歉。我试图尽可能地简化它,并且可能已经将它简化了太多!

提前致谢!

2 个答案:

答案 0 :(得分:2)

你的第二个解决方案是有道理的,但可能导致性能灾难,因为它会在内存中加载来自美国的所有地址,而你只对它们的数量以及这些地址的一小部分感兴趣。执行查询时,查询将返回一个列表,并使用查询的所有结果填充此列表。这就是setFirstResult和setMaxResults有用的原因。

如果您不关心绝对精确的计数,则只能执行一次计数查询,并对每个页面执行“结果”查询。

答案 1 :(得分:0)

您可以执行以下操作 -

Query query = getSession().createQuery("your Query").setFirstResult(start_Index).setMaxResults(Number_Of_Records_You_Want_to_Display_on_page);

例如 -

Query query = getSession().createQuery("select * from employee").setFirstResult(101).setMaxResults(100);