Как встраивать подсказки Oracle в запрос Hibernate
С помощью подсказок Oracle вы можете изменять планы выполнения Oracle, чтобы влиять на то, как Oracle извлекает данные из базы данных. Перейдите сюда, чтобы узнать больше оOracle optimizer hints.
Возможно ли в Hibernate встроить подсказку Oracle в запрос Hibernate?
Hibernate setComment ()?
Можете ли вы встроить подсказку Oracle в HQL с помощью функции пользовательского комментария Hibernate «setComment()»? Давайте посмотрим пример здесь
1. Оригинальный запрос Hibernate
Это простой выбор 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 example.stock stock0_ where stock0_.STOCK_CODE=?
2. Попробуйте Hibernate setComment ()
Включитеhibernate.use_sql_comments в файле конфигурации Hibernate (hibernate.cfg.xml), чтобы выводить настраиваемый комментарий в файл журнала или консоль.
...... true true true
Использование HibernatesetComment() для вставки пользовательского комментария к вашему запросу.
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 example.stock stock0_ where stock0_.STOCK_CODE=?
3. Это работа?
Нет, есть две проблемы с пользовательскими комментариями Hibernate.
1. Подсказка Oracle должна добавляться после «выбора», а не до.
Hibernate сгенерированный запрос
/* + INDEX(stock idx_stock_code) */ select
Правильный путь должен быть ...
select /*+ INDEX(stock idx_stock_code) */
2. Hibernate автоматически добавит дополнительный пробел между «/ * +».
В Hibernate до сих пор не существует официального способа встроить подсказки Oracle в языки запросов Hibernate (HQL).
P.S Thanks Pete contribute on this.
Рабочий раствор
Единственное решение - использовать метод HibernatecreateSQLQuery для выполнения собственного оператора 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 = ?
БольшеNative SQL queries examples.