HibernateクエリにOracleのヒントを埋め込む方法
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]