Рубрики
Без рубрики

Как встроить подсказки Oracle в запрос гибернации

– Как встроить подсказки Oracle в запрос гибернации

С помощью подсказок 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/”