Hibernateの名前付きクエリの例
多くの場合、開発者はHQL文字列リテラルをJavaコード全体に散りばめたいのですが、この方法は保守が難しく、見苦しくなります。 幸い、Hibernateは「names queries」と呼ばれる手法を採用しています。これにより、開発者はすべてのHQLをXMLマッピングファイルまたは注釈を介して配置できます。
名前付きクエリを宣言する方法
名前付きクエリは、HQLまたはネイティブSQLの両方でサポートされています。 例を参照してください…
1. XMLマッピングファイル
マッピングファイルのHQL
...
マッピングファイルのネイティブSQL
...
名前付きクエリは 'hibernate-mapping'要素内に配置できますが、 'class'要素の前には配置しないでください。Hibernateは無効なマッピングファイルを要求します。すべての名前付きクエリは 'classの要素。
Note
CDATAに関しては、クエリテキストをCDATAでラップすることをお勧めします。これにより、XMLパーサーが「>」や<「などの特殊なXML文字に対してエラーを表示しないようにします。
2. アノテーション
アノテーションのHQL
@NamedQueries({ @NamedQuery( name = "findStockByStockCode", query = "from Stock s where s.stockCode = :stockCode" ) }) @Entity @Table(name = "stock", catalog = "example") public class Stock implements java.io.Serializable { ...
アノテーションのネイティブSQL
@NamedNativeQueries({ @NamedNativeQuery( name = "findStockByStockCodeNativeSQL", query = "select * from stock s where s.stock_code = :stockCode", resultClass = Stock.class ) }) @Entity @Table(name = "stock", catalog = "example") public class Stock implements java.io.Serializable { ...
ネイティブSQLでは、「resultClass」を宣言して戻り値の型をHibernateに通知する必要があります。これを行わないと、例外「org.hibernate.cfg.NotYetImplementedException: Pure native scalar queries are not yet supported」が発生します。
名前付きクエリを呼び出す
Hibernateでは、getNamedQueryメソッドを介して名前付きクエリを呼び出すことができます。
Query query = session.getNamedQuery("findStockByStockCode") .setString("stockCode", "7277");
Query query = session.getNamedQuery("findStockByStockCodeNativeSQL") .setString("stockCode", "7277");
結論
名前付きクエリはグローバルアクセスです。つまり、クエリの名前はXMLマッピングファイルまたは注釈内で一意でなければなりません。 実際の環境では、すべての名前付きクエリを独自のファイルに分離することを常にお勧めします。 さらに、Hibernateマッピングファイルまたは注釈に保存されている名前付きクエリは、Javaコードを介して散在するクエリよりも簡単に管理できます。