Ограничительный механизм ограничения гибернации?
Поддержка Hibernate Criteria предоставляет метод setMaxResults()
для ограничения результатов, возвращаемых из db.
Я не могу найти ответа на это в своей документации - как это реализовано? Просит ли он весь набор результатов и затем возвращает только номер запроса? Или это действительно ограничивает запрос на конец базы данных (думайте о ключе LIMIT, как в mySql).
Это важно, потому что если запрос потенциально может вернуть много результатов, мне действительно нужно знать, будет ли setMaxResults()
запрашивать все строки в базе данных (что было бы плохо).
Кроме того, если он действительно ограничивает количество строк в конце базы данных, как это достигается этим перекрестным db (поскольку я не думаю, что каждый rdbms поддерживает функцию LIMIT, например mySql).
Ответы
Ответ 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.