我想问一下,在使用这两种方法之前,Criteria setFirstResult 和 setMaxResults 是否会干扰我正在申请的订单。我注意到,当字段上的 addingOrder 时,该字段重复的结果将按记录的id排序。如果我在订单后的条件上应用 setFirstResult , setMaxResults ,则会根据它们的保存方式对相同的结果进行排序。
答案 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()
顺便说一句,让我知道我的我的基本假设/解释本身是错的,我希望不会。