У меня есть объект с ленивой инициализированной коллекцией:
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.