【问题标题】:Sublisting a result from Hibernate从 Hibernate 子列表结果
【发布时间】:2012-06-07 09:51:08
【问题描述】:

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

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

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

提前致谢!

【问题讨论】:

    标签: java sql hibernate jpa


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回答。我认为这回答了我的问题。我不确定是否会加载所有美国地址。我的理解是,Hibernate 只返回对象的外壳,然后在代码实际访问每个字段时显式地检索每个字段。我不确定 size() 会在结果列表中做什么 - 因此我的问题
    • 我真的建议您在使用 Hibernate 进行开发时打开 SQL 日志记录。这将使您了解 Hibernate 何时执行查询、执行哪些查询以及您可以采取哪些措施来避免不必要的查询。
    【解决方案2】:

    你可以这样做-

    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);
    

    【讨论】:

    • 是的,我正在考虑做类似的事情,但我想使用命名查询,以便检查编译类型。
    猜你喜欢
    • 1970-01-01
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多