Hibernate Criteria - Order and Pagination

时间:2016-03-23 07:34:09

标签: java hibernate

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

1 个答案:

答案 0 :(得分:0)

  

如果该字段重复的结果按记录的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之后的条件,相同   结果按照他们的保存方式排序。

上述两个语句也无法保证,除非基础数据库确保即使按非唯一列值排序也会返回相同顺序的行。请参阅下面的输出。

注意:我已经使用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]]

使用setOirstResult之前的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]]

我认为如果你多次运行它,即使我们没有相对于addOrder(..)更改setFirst/MaxResults方法,您也可能会发现订单无法保证。

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

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

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

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

顺便说一句,让我知道我的我的基本假设/解释本身是错的,我希望不会。