Oracleのヒントを使用すると、Oracleの実行計画を変更して、Oracleがデータベースからデータを取得する方法に影響を与えることができます。

Oracleオプティマイザのヒント

の詳細については、こちらを参照してください。

Hibernateでは、HibernateクエリにOracleヒントを埋め込むことは可能ですか?

Hibernate setComment()?

Hibernateのカスタムコメント ”

setComment()

“機能を使用してOracleヒントをHQLに埋め込むことはできますか?ここで例を見てみましょう

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 mkyong.stock stock0__
    where stock0__.STOCK__CODE=?

2. Hibernate setComment()を試してください.

カスタムコメントをログファイルまたはコンソールに出力するには、Hibernateの設定ファイル(hibernate.cfg.xml)で

hibernate.use

sql

comments

を有効にします。

<!-- hibernate.cfg.xml -->
<?xml version="1.0" encoding="utf-8"?>
...

<hibernate-configuration> <session-factory> ...

<property name = "show__sql"> true </property>
    <property name = "format__sql"> true </property>
    <property name = "use__sql__comments"> true </property>
    <mapping class = "com.mkyong.common.Stock"/>
  </session-factory>
</hibernate-configuration>

Hibernate

setComment()

を使用して、カスタムコメントをクエリに挿入します。

ストリングhql = "ストックからs.stockCode =:stockCode";
リスト結果= session.createQuery(hql)
.setString( "stockCode"、 "7277")
.setComment( "INDEX(idx__stock__code)")
。リスト();

出力

休止状態:/**  + INDEX(株式idx__stock__code)** /を選択すると、ストック0__STOCK__IDはSTOCK1__0__、ストック0__STOCK__CODEはSTOCK2__0__、ストック0__STOCK__NAMEはストック3__0__からmkyong.stock stock0__はストック0__STOCK__CODE =?

3. Is this work?

It’s not, there are two problem with Hibernate custom comments.

1. The Oracle hint have to append after the ‘select’, not before.

Hibernate generated query

/**  INDEX(株式idx__stock__code)** /select

正しい方法は…​

/**  INDEX(株式idx__stock__code)** /....

{空} 2。 Hibernateは "/** "の間に余分なスペースを追加します
自動的に。

Hibernateでは、Oracleのヒントを埋め込む正式な方法はまだありません
Hibernateクエリ言語(HQL)に変換します。

__P.S Peteさんに感謝します.__

===実用的な解決策

唯一の解決策は、Hibernate **  createSQLQuery ** メソッドを使用して
ネイティブSQL文を実行します。

文字列hql = “/

INDEX(株式idx

stock

code)

/    ストックからsを選択** s.stock__code =:stockCode “;
リスト結果= session.createQuery(hql)
.setString( “stockCode”、 “7277”)
。リスト();

出力

Hibernate:/

+ INDEX(stockx idx

stock

code)

/select ** from stocksはどこからs.stock__code =?

More link://hibernate/hibernate-native-sql-queries-examples/[Native SQL
queries examples].

link://tag/hibernate/[hibernate]link://tag/oracle/[oracle]