Критерии лимитирующего механизма Hibernate? - PullRequest
18 голосов
/ 01 сентября 2011

Поддержка Hibernate Criteria предоставляет метод setMaxResults() для ограничения результатов, возвращаемых из базы данных.

Я не могу найти ответ на этот вопрос в их документации - как это реализовано?Запрашивает ли он весь набор результатов, а затем возвращает только номер запроса?Или это действительно ограничение запроса в конце базы данных (например, ключевое слово LIMIT, как в mySql).

Это важно, потому что, если запрос потенциально может вернуть много много результатов, мне действительно нужно знать, если setMaxResults()будет по-прежнему запрашивать все строки в базе данных (что было бы плохо).

Кроме того - если это действительно ограничивает количество строк в конце базы данных, как он достигает этого кросс-дБ (так как я нене думаю, что каждый rdbms поддерживает функцию LIMIT, как mySql).

Ответы [ 5 ]

13 голосов
/ 01 сентября 2011

Hibernate просит базу данных ограничить результаты, возвращаемые запросом. Это делается с помощью диалекта, который использует какой-либо механизм, специфичный для базы данных, чтобы сделать это (поэтому для SQL Server он будет делать что-то вроде «выбрать верхний n * из таблицы», Oracle будет «выбирать * из таблицы, где rownum

6 голосов
/ 01 сентября 2011

Класс org.hibernate.dialect.Dialect содержит метод с именем supportsLimit(). Если подклассы диалекта переопределяют этот метод, они могут реализовать обработку ограничения строк способом, родным для их разновидности базы данных. Вы можете видеть, откуда этот код вызывается в классе org.hibernate.loader.Loader , который имеет метод под названием prepareQueryStatement, просто найдите слово limit .

Однако, если диалект не поддерживает эту функцию, существует жесткая проверка итератора ResultSet, который гарантирует, что результаты объекта Java (сущности) перестанут создаваться при достижении предела. Этот код также находится в Loader.

2 голосов
/ 01 сентября 2011

Я использую Hibernate и Hibernate Search и, не глядя на базовую реализацию, могу сказать, что они определенно не возвращают все результаты. Я реализовал тот же запрос, возвращающий все результаты, а затем изменил его, чтобы задать первый результат и максимальные результаты (для реализации разбивки на страницы), и прирост производительности был огромным.

Они, вероятно, используют для этого специфический для диалекта SQL, например, LIMIT в MySQL, ROWNUM в Oracle. Ваш менеджер сущностей знает о диалекте, который вы используете, так что это просто.

Наконец, если вы действительно хотите проверить, что SQL Hibernate создает для этого запроса, просто установите для свойства "show_sql" значение true, когда вы создаете свой менеджер / фабрику сущностей, и он выплевывает весь SQL, который он запускает, на консоль.

0 голосов
/ 11 июня 2018

Я знаю, что Вопрос немного стар.Но да, setMaxResults() действительно ограничивает количество строк в конце базы данных.

Если вы действительно посмотрите на вывод Hibernate SQL, вы обнаружите, что следующий оператор SQL был добавлен к вашему запросу.

limit ?

0 голосов
/ 01 сентября 2011

HQL не поддерживает ограничение внутри запроса, как в SQL, только setMaxResults(), который вы также нашли.

Чтобы выяснить, преобразует ли он setMaxResults() в запрос LIMIT, вы можете включитьна вашем журнале SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...