1

遅延初期化コレクションを持つエンティティがあります:

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

Hibernate 生成 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 がこのインデックスを使用せず、テーブルに対してフル スキャンを使用することがあります。私はDBを制御していませんが、これに対する解決策はOracleにヒントを渡すことであると(db管理者から)言われました。

このようなもの:

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でテストしたところ、SELECTステートメントの前に配置された場合、Oracleはこのヒントを認識しないようです。

4

1 に答える 1

0

これは、次のプロパティを有効にすることで実現でき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();

ただし、コード内の関係をより詳細に制御する必要があることを意味しますが、これは少し面倒です。

幸運を!

于 2014-05-22T11:18:01.013 に答える