0

我正在对休眠的一组结果进行分页。目前我正在做

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 时,它​​会计算它返回的对象外壳还是尝试解决所有问题然后访问数据库?使用哪种模式更好?

如果示例不够清楚,请致歉。我试图尽可能地简化它,可能已经简化得太多了!

提前致谢!

4

2 回答 2

2

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

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

于 2012-06-07T10:17:57.997 回答
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);
于 2012-06-07T10:08:01.643 回答