【问题标题】:Hibernate Criteria - Order and PaginationHibernate Criteria - 顺序和分页
【发布时间】:2016-03-23 07:34:09
【问题描述】:

我想问一下,在使用这两种方法之前,Criteria setFirstResultsetMaxResults 是否会干扰我正在应用的订单。我注意到,当 addingOrder 在字段上时,如果该字段重复的结果将按记录的 id 排序。如果我将 setFirstResult, setMaxResults 应用于 Order 之后的条件,则相同的结果将按照它们的保存方式进行排序。

【问题讨论】:

  • 请贴出代码和相关的休​​眠映射。
  • Order By 最后才被应用。所以有限的结果是有序的。这是预期的行为

标签: java hibernate


【解决方案1】:

如果任何被该字段重复的结果将按记录的 id 排序。

基于上述陈述,我的基本假设/解释是您指的是您在具有重复/相同值的字段/列上应用 addOrder 的场景(与非唯一值)。

我尝试了示例代码并注意到在这两种情况下生成的 SQL 是相同的。 (addOrder是在setFirst/MaxResults之前还是之后指定的)。

Hibernate: select this_.id as id1_0_0_, this_.name as name2_0_0_, this_.version as version3_0_0_ from SimplePost this_ order by this_.name asc limit ?

我注意到在字段上添加订单时,如果有结果 由该字段重复的按记录的 id 排序。如果我申请 setFirstResult, setMaxResults 在 Order 之后的条件上,相同 结果按保存方式排序。

上述两个语句也不能保证,除非底层数据库确保即使按非唯一列值排序,它也能以相同的顺序返回行。见下面的输出。 p>

注意:我已经使用 Hibernate5 和 h2 内存数据库进行了测试。并且多次运行的插入顺序是相同的。

在 setMaxResults 之后加上 addOrder,使用的查询:

session1.createCriteria(OrderByPost.class).setFirstResult(0).setMaxResults(3).addOrder(Order.asc("name")).list()

结果:

[Post [id=1, name=Apost], Post [id=3, name=Bpost], Post [id=6, name=Bpost]]
[Post [id=1, name=Apost], Post [id=4, name=Bpost], Post [id=6, name=Bpost]]
[Post [id=1, name=Apost], Post [id=2, name=Bpost], Post [id=6, name=Bpost]]
[Post [id=1, name=Apost], Post [id=3, name=Bpost], Post [id=6, name=Bpost]]
[Post [id=1, name=Apost], Post [id=4, name=Bpost], Post [id=6, name=Bpost]]

在 setFirstResult 之前使用 addOrder,使用的查询:

session1.createCriteria(OrderByPost.class).addOrder(Order.asc("name")).setFirstResult(0).setMaxResults(3).list()

结果:

[Post [id=1, name=Apost], Post [id=3, name=Bpost], Post [id=6, name=Bpost]]
[Post [id=1, name=Apost], Post [id=6, name=Bpost], Post [id=4, name=Bpost]]
[Post [id=1, name=Apost], Post [id=6, name=Bpost], Post [id=4, name=Bpost]]
[Post [id=1, name=Apost], Post [id=3, name=Bpost], Post [id=6, name=Bpost]]
[Post [id=1, name=Apost], Post [id=6, name=Bpost], Post [id=4, name=Bpost]]
[Post [id=1, name=Apost], Post [id=6, name=Bpost], Post [id=4, name=Bpost]]

我认为,如果您运行几次,您可能会发现即使我们不更改相对于 setFirst/MaxResultsaddOrder(..) 方法,也无法保证顺序。

基于上述观察,我相信,当我们在一个字段上指定addOrder 时,hibernate 所保证的只是结果按该字段排序。

如果该字段/列恰好对某些行具有重复/相同的值,hibernate 并不能确保我们会以相同的顺序获取这些行以进行多次执行。

如果我们对可能具有重复/相同值的字段/列进行排序,一个确保我们每次都以相同顺序获得结果的选项是在某个唯一字段上添加另一个 addOrder,例如 @987654333 @如下:

session1.createCriteria(OrderByPost.class).setFirstResult(0).setMaxResults(7).addOrder(Order.asc("name")).addOrder(Order.asc("id")).list()

顺便说一句,如果我我的基本假设/解释本身有误,请告诉我,我希望不会。

【讨论】:

    猜你喜欢
    • 2012-06-17
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-24
    • 2011-10-28
    相关资源
    最近更新 更多