HibernateネイティブSQLクエリの例
Hibernateでは、HQLまたは基準クエリにより、ほぼすべてのSQLクエリを実行できます。 ただし、多くの開発者は、Hibernateの生成されたSQLステートメントが遅く、独自のSQL(ネイティブSQL)ステートメントを生成することを好むことに不満を持っています。
ネイティブSQLクエリの例
Hibernateは、ネイティブSQLステートメントを直接呼び出すことができるcreateSQLQueryメソッドを提供します。
1. この例では、HibernateにStock.classを返すように指示します。すべての選択データ(*)はStock.classプロパティに自動的に一致します。
Query query = session.createSQLQuery( "select * from stock s where s.stock_code = :stockCode") .addEntity(Stock.class) .setParameter("stockCode", "7277"); List result = query.list();
2. この例では、HibernateはObject配列を返します。
Query query = session.createSQLQuery( "select s.stock_code from stock s where s.stock_code = :stockCode") .setParameter("stockCode", "7277"); List result = query.list();
または、named queryを使用してネイティブSQLステートメントを呼び出すこともできます。 Hibernate named query examples hereを参照してください。
Hibernateの生成されたSQLステートメントは遅い!?
「Hibernateの生成されたSQLステートメントが遅い」というステートメントには同意しません。 多くの場合、これは、開発者がテーブルの関係をよく理解しておらず、間違ったテーブルマッピングを行ったか、フェッチ戦略を誤用したためであることがわかりました。 Hibernateが不必要なSQLステートメントを生成したり、不必要なテーブルを結合したりします。そして、開発者はこの言い訳を取り、独自のSQLステートメントを作成してバグをすばやく修正したいと考えています。
結論
私はいつかネイティブSQLステートメントがHQLよりも本当に便利で簡単なことを認めますが、なぜネイティブSQLステートメントが必要なのかを慎重に考えますか? これは本当にHibernateができないのですか? はいの場合、次に進みます〜
P.S In Oracle database, i more prefer to use native SQL statement in many critical performance queries, because i need to put the “hint” to improve the Oracle query performance.