我正在对来自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还是尝试解析所有内容然后点击数据库?哪种模式更好?
如果示例不够明确,请道歉。我试图尽可能地简化它,并且可能已经将它简化了太多!
提前致谢!
答案 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);