2016-03-23 3 views
0

Я хочу спросить, если критерии setFirstResult и setMaxResults может помешать Приказа я применяю перед использованием обоих методов. Я заметил, что когда addOrder в поле, результаты, если какие-либо повторяемые этим полем сортируются по идентификатору записей. Если я применяю setFirstResult, setMaxResults по критериям после заказа, то же результаты сортируются по тому, как они были сохранены.Hibernate Критерии - Заказ и Pagination

+0

Пожалуйста, разместите код и соответствующие сопоставления спящего режима. –

+0

'Order By' применяется только последним. Таким образом, ограниченный результат упорядочен. Это ожидаемое поведение –

ответ

0

Результаты, если они повторяются этим полем, сортируются по идентификатору записей.

На основании вышеприведенного утверждения, мое основное предположение/интерпретация является то, что вы имеете в виду сценарий, в котором вы подаете 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 ? 

Я заметил, что когда addingOrder на поле, результаты, если любой повторенной этой области сортируются по идентификатору записей. Если я применил setFirstResult, setMaxResults по критериям после заказа, то такие же результаты сортируются по тому, как они были сохранены.

выше два утверждение также не гарантируется, , если лежащий в основе базы данных не гарантирует, что он возвращает строки того же порядка, даже если отсортировано по неуникальными значений столбцов. См. Приведенный ниже вывод.

ПРИМЕЧАНИЕ: Я тестировал базу данных с памятью Hibernate5 и h2. И порядок вставок одинаковый для нескольких прогонов.

С addOrder после setMaxResults, запрос используется:

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]] 

С addOrder Перед setFirstResult, запрос используется:

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

Кстати, дайте мне знать, если я получил мое основное предположение/толкование самого неправильно, что я надеюсь, что нет.

Смежные вопросы