С помощью подсказок Oracle вы можете изменить планы выполнения Oracle, чтобы повлиять на то, как Oracle извлекает данные из базы данных. Перейдите сюда для получения более подробной информации о подсказках Oracle optimizer.
В режиме гибернации возможно ли встроить подсказку Oracle в запрос Hibernate?
Комментарий к набору гибернации()?
Можете ли вы встроить подсказку Oracle в HQL с помощью пользовательского комментария Hibernate ” setComment() ” функция? Давайте рассмотрим пример здесь
1. Исходный запрос на гибернацию
Это простой выбор HQL для извлечения акций с кодом акций.
String hql = "from Stock s where s.stockCode = :stockCode"; List result = session.createQuery(hql) .setString("stockCode", "7277") .list();
Выход
Hibernate: select stock0_.STOCK_ID as STOCK1_0_, stock0_.STOCK_CODE as STOCK2_0_, stock0_.STOCK_NAME as STOCK3_0_ from mkyong.stock stock0_ where stock0_.STOCK_CODE=?
2. Попробуйте установить комментарий в режиме гибернации()
Включите hibernate.use_sql_comments в файле конфигурации Hibernate (hibernate.cfg.xml ) для вывода пользовательского комментария в файл журнала или консоль.
...... true true true
Использование Hibernate set Comment() для вставки пользовательского комментария к вашему запросу.
String hql = "from Stock s where s.stockCode = :stockCode"; List result = session.createQuery(hql) .setString("stockCode", "7277") .setComment("+ INDEX(stock idx_stock_code)") .list();
Выход
Hibernate: /* + INDEX(stock idx_stock_code) */ select stock0_.STOCK_ID as STOCK1_0_, stock0_.STOCK_CODE as STOCK2_0_, stock0_.STOCK_NAME as STOCK3_0_ from mkyong.stock stock0_ where stock0_.STOCK_CODE=?
3. Это работа?
Это не так, есть две проблемы с пользовательскими комментариями в режиме гибернации.
1. Подсказка оракула должна быть добавлена после “выбрать”, а не раньше.
Спящий режим сгенерированного запроса
/* + INDEX(stock idx_stock_code) */ select
Правильный путь должен быть…
select /*+ INDEX(stock idx_stock_code) */
2. Режим гибернации автоматически добавит дополнительное пространство между “/*+”.
В Hibernate до сих пор нет официального способа встроить подсказки Oracle в язык запросов Hibernate (HQL).
P.S Спасибо, что внес свой вклад в это.
Рабочее решение
Единственное решение – использовать режим гибернации Метод CreateSQLQuery для выполнения собственного оператора SQL.
String hql = "/*+ INDEX(stock idx_stock_code) */ select * from stock s where s.stock_code = :stockCode"; List result = session.createQuery(hql) .setString("stockCode", "7277") .list();
выход
Hibernate: /*+ INDEX(stock idx_stock_code) */ select * from stock s where s.stock_code = ?
Подробнее Примеры собственных SQL-запросов .
Оригинал: “https://mkyong.com/hibernate/how-to-embed-oracle-hints-in-hibernate-query/”