HibernateネイティブSQLクエリの例

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.