Ленивая инициализированная коллекция Hibernate с подсказкой для Oracle DB

У меня есть объект с ленивой инициализированной коллекцией:

SomeEntity someEntity = template.findByNamedQuery("queryName", entityId);
if (someEntity != null) {
    Hibernate.initialize(someEntity.getChildCollection());
}

Спящий режим генерирует SQL:

SELECT 
  t.COL1 AS COL1_,
  t.COL2 AS COL2_,
  ...
  t.COLN AS COLN_
FROM SCHEMA.TABLE t
WHERE t.COLX = :1
ORDER BY t.COL1 ASC;

В столбце COLX есть индекс IDX_COLX.

Но по какой-то неизвестной причине иногда Oracle не использует этот индекс и использует полное сканирование таблицы. Я не контролирую БД, но мне сказали (администратор БД), что решение этой проблемы - передать подсказки для Oracle.

Что-то вроде этого:

SELECT /*+ index(t IDX_COLX) */
  t.COL1 AS COL1_,
  t.COL2 AS COL2_,
  ...
  t.COLN AS COLN_
FROM SCHEMA.TABLE t
WHERE t.COLX = :1
ORDER BY t.COL1 ASC;

Есть ли простой способ заставить спящий режим прикрепить эту дополнительную информацию к сгенерированному SQL-запросу? Я не хочу переписывать все приложение из-за какой-то ошибки Oracle или неправильной конфигурации.

Я использую спящий режим 3.3.2.

ИЗМЕНИТЬ:

Я попробовал решение, данное StuPointerException, и сгенерированный SQL выглядит так:

/*+ index(t IDX_COLX) */
SELECT
  t.COL1 AS COL1_,
  t.COL2 AS COL2_,
  ...
  t.COLN AS COLN_
FROM SCHEMA.TABLE t
WHERE t.COLX = :1
ORDER BY t.COL1 ASC;

Протестировано в Oracle SQL Developer, и похоже, что Oracle не распознает эту подсказку, если она помещена перед оператором SELECT.


person bary    schedule 22.05.2014    source источник


Ответы (1)


Вы можете добиться этого, включив свойство use_sql_comments на вашем HibernateSessionFactory:

<property name="use_sql_comments">true</property>

Затем вы сможете сделать это:

String hql = "from SomeEntity e where e.COLX = :colx";
List result = session.createQuery(hql)
        .setString("colx", "xyz")
        .setComment("+ index(t IDX_COLX)")
        .list();

Это означает, что вам нужно больше контролировать отношения в вашем коде, что немного неудобно.

Удачи!

person StuPointerException    schedule 22.05.2014
comment
Спасибо за Ваш ответ. Комментарий действительно появился в сгенерированном SQL, но, к сожалению, до оператора SELECT, и он не работал должным образом. - person bary; 22.05.2014