Как встраивать подсказки Oracle в запрос Hibernate

Как встраивать подсказки 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 = ?
Related