Подтвердить что ты не робот

Ограничительный механизм ограничения гибернации?

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

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

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

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

4b9b3361

Ответ 1

Hibernate запрашивает базу данных для ограничения результатов, возвращаемых запросом. Это делается с помощью диалекта, который использует какой-то механизм, специфичный для конкретной базы данных, для этого (поэтому для SQL Server он будет делать что-то вроде "select top n * from table", Oracle будет "выбирать" из таблицы, где rownum < n ", MySQL будет делать" select * from table limit n "и т.д.). Затем он просто возвращает то, что возвращает база данных.

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

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