В Hibernate 3 есть ли способ сделать эквивалент следующего ограничения MySQL в HQL?
select * from a_table order by a_table_column desc limit 0, 20;
Я не хочу использовать setMaxResults, если это возможно. Это определенно было возможно в более старой версии Hibernate / HQL, но, похоже, оно исчезло.
java
hibernate
hql
hibernate3
stevedbrown
источник
источник
Hibernate-5.0.12
. Это все еще не доступно? Было бы очень тяжело получить около миллиона записей, а затем применить к ним фильтр,setMaxResults
как заметил @Rachel в ответе @skaffman.Ответы:
Это было опубликовано на форуме Hibernate несколько лет назад, когда его спросили о том, почему это работает в Hibernate 2, но не в Hibernate 3:
Так что, если он работал в Hibernate 2, похоже, что это было случайно, а не по замыслу. Я думаю, что это произошло потому, что Hibernate 2 HQL-анализатор заменит биты запроса, которые он распознал как HQL, и оставит все остальное как есть, чтобы вы могли проникнуть в какой-то нативный SQL. Hibernate 3, однако, имеет правильный синтаксический анализатор AST HQL, и он намного менее прощающий.
Я думаю, что на
Query.setMaxResults()
самом деле ваш единственный вариант.источник
setMaxResults
который будет принимать ограниченное количество строк результатов из набора результатов и отображать его пользователю, в моем случае у меня есть 3 миллиона записей, которые запрашиваются, а затем вызываю setMaxResults для установки 50 записей, но я не хочу этого делать, хотя сам запрос я хочу запросить 50 записей, есть ли способ сделать это?setMaxResults
Hibernate добавитlimit
часть к запросу. Он не получит все результаты. Вы можете проверить запрос, который он производит, включив:<property name="show_sql">true</property>
источник
setFirstResult
на самом деле упоминается в этом ответе, тогда как здесь и в других местах они просто говорятsetMaxResults
это иsetMaxResults
то, не упоминая, как установить смещение.Если вы не хотите использовать
setMaxResults()
наQuery
объекте , то вы всегда можете вернуться к использованию нормального SQL.источник
Если вы не хотите использовать setMaxResults, вы также можете использовать Query.scroll вместо list и получить нужные вам строки. Полезно для подкачки, например.
источник
setMaxResults()
сначала загружает каждую запись в памяти, а затем создает подсписок, который при сотнях тысяч или более записей приводит к сбою сервера, потому что ему не хватает памяти. Однако я мог бы перейти от запроса с типом JPA к запросу Hibernate,QueryImpl hibernateQuery = query.unwrap(QueryImpl.class)
а затем я мог бы использоватьscroll()
метод, как вы предложили.Вы можете легко использовать нумерацию страниц для этого.
Вы должны пройти,
new PageRequest(0, 1)
чтобы получить записи и из списка получить первую запись.источник
setFirstResult
ИsetMaxResults
Query
методыДля JPA и Hibernate
Query
, тоsetFirstResult
метод является эквивалентомOFFSET
, аsetMaxResults
метод является эквивалентом LIMIT:LimitHandler
абстракцияHibernate
LimitHandler
определяет логику разбивки на страницы для конкретной базы данных, и, как показано на следующей диаграмме, Hibernate поддерживает множество опций разбивки на базы данных:Теперь, в зависимости от используемой вами системы реляционной базы данных, вышеприведенный запрос JPQL будет использовать правильный синтаксис разбиения на страницы.
MySQL
PostgreSQL
SQL Server
оракул
Преимущество использования
setFirstResult
иsetMaxResults
заключается в том, что Hibernate может генерировать синтаксис пагинации для конкретной базы данных для любых поддерживаемых реляционных баз данных.И вы не ограничены только запросами JPQL. Вы можете использовать
setFirstResult
иsetMaxResults
метод семь для собственных запросов SQL.Собственные запросы SQL
Вам не нужно жестко кодировать нумерацию базы данных при использовании собственных запросов SQL. Hibernate может добавить это к вашим запросам.
Итак, если вы выполняете этот SQL-запрос на PostgreSQL:
Hibernate преобразует его следующим образом:
Круто, верно?
Помимо нумерации на основе SQL
Разбивка на страницы хороша, когда вы можете индексировать критерии фильтрации и сортировки. Если ваши требования к нумерации страниц подразумевают динамическую фильтрацию, лучше использовать решение с обратным индексом, такое как ElasticSearch.
Проверьте эту статью для более подробной информации.
источник
String hql = "select userName from AccountInfo order by points desc 5";
Это работало для меня без использования
setmaxResults();
Просто укажите максимальное значение в последнем (в данном случае 5) без использования ключевого слова
limit
. :Писточник
Мое наблюдение состоит в том, что даже если у вас есть ограничение в HQL (hibernate 3.x), оно будет либо вызывать ошибку синтаксического анализа, либо просто игнорироваться. (если у вас есть порядок по + desc / asc до лимита, он будет проигнорирован, если у вас нет desc / asc до лимита, это вызовет ошибку синтаксического анализа)
источник
Если можете управлять лимитом в этом режиме
Это действительно простой код для обработки лимита или списка.
источник
источник
Вам нужно написать собственный запрос, обратитесь к этому .
источник
Вы можете использовать ниже запрос
источник
Приведенный ниже фрагмент используется для выполнения лимитного запроса с использованием HQL.
Вы можете получить демонстрационное приложение по этой ссылке .
источник
источник