HIBERNATE. Трансляция HQL в SQL

Запросы к БД в HIBERNATE можно писать, в частности, на HQL.
Эти запросы HIBERNATE транслирует в SQL запрос, который передает на выполнение JDBC.
Текст транслированного sql запроса, при его выполнении, можно для отладки выводить в консоль или лог файл, если задать в конфигурационном файле соответствующий параметр.
Но часто, в целях, например, ускорения отладки HQL запроса, необходимо получить текст транслированного SQL запроса, не дожидаясь его выполнения.
Чтобы не добираться долго до нужного места в задаче, где срабатывает выполнение этого запроса, а выполнить трансляцию HQL запроса в начале задачи, можно использовать транслятор HQL запросов HIBERNATE. При этом, собственно выполнения запроса SQL не происходит.
Вот текст класса Main, который выполняет данную задачу. Подразумевается, что класс еntity Item присутствует в пакете и доступен классу Main и правильно отмаплен на таблицу, иначе трансляция не сработает.

При вызове конструктора QueryTranslatorImpl передается в enabledFilters пустая коллекция Collections.EMPTY_MAP. Если вы хотите задействовать в Query предопределенные фильтры, надо их перечислить в передаваемой коллекции и они присоединятся к SQL запросу в виде дополнительных предикатов.
При вызове qti.compile в параметр shallow (второй параметр) можно передавать true или false. Это имеет значение для HQL запроса, у которого в select возвращается entity, в данном случае item, (в этом случае Query возвращает List). Если передается true, то у sql запроса в select будет только ключевое поле (item_id), если false, то все поля таблицы item.
Если в HQL в select перечислены поля, а не entity (в этом случае Query возвращает list<Object[]>) значение данного параметра не играет никакого значения.
Для примера использовались java8 и HIBERNATE 5.2.

Добавить комментарий