Запросы к БД в HIBERNATE можно писать, в частности, на HQL.
Эти запросы HIBERNATE транслирует в SQL запрос, который передает на выполнение JDBC.
Текст транслированного sql запроса, при его выполнении, можно для отладки выводить в консоль или лог файл, если задать в конфигурационном файле соответствующий параметр.
Но часто, в целях, например, ускорения отладки HQL запроса, необходимо получить текст транслированного SQL запроса, не дожидаясь его выполнения.
Чтобы не добираться долго до нужного места в задаче, где срабатывает выполнение этого запроса, а выполнить трансляцию HQL запроса в начале задачи, можно использовать транслятор HQL запросов HIBERNATE. При этом, собственно выполнения запроса SQL не происходит.
Вот текст класса Main, который выполняет данную задачу. Подразумевается, что класс еntity Item присутствует в пакете и доступен классу Main и правильно отмаплен на таблицу, иначе трансляция не сработает.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
package hb; import java.sql.SQLException; import java.util.Collections; import org.hibernate.Session; import org.hibernate.engine.jdbc.internal.FormatStyle; import org.hibernate.hql.internal.ast.QueryTranslatorImpl; import hbUtils.HibernateUtil; public class Main { public static Session session = null; public static void main(String[] args) throws SQLException { System.out.println( "Начали выполнение задачи!!!"); try { session = HibernateUtil.getSessionFactory().openSession(); String sHQL = // формируем текст HQL запроса "select item " + "from Item item where itemId = :bd"; System.out.println( "\n----------------- исходный HQL запрос -----------" ); System.out.println(sHQL); // ----- транслируем HQL запрос в SQL запрос -------------- QueryTranslatorImpl qti = new QueryTranslatorImpl( sHQL, sHQL, Collections.EMPTY_MAP, HibernateUtil.getSessionFactory().getSessionFactory()); qti.compile( null, false); System.out.println( "\n----------------- получаем SQL запрос -----------" ); System.out.println(qti.getSQLString()); System.out.println( "\n----------------- отформатированный SQL запрос -----------" ); System.out.println(FormatStyle.BASIC.getFormatter().format( qti.getSQLString() )); } catch (Exception e) { e.printStackTrace(); } finally { HibernateUtil.getSessionFactory().close(); } System.out.println( "Завершили выполнение задачи!!!"); } } |
При вызове конструктора 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.
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.