Hibernateを使用するときに、名前付きクエリでオプションのパラメーター(検索パラメーターがフォームから提供され、すべてのパラメーターが必要なわけではない場合など)を指定する方法はありますか?ネイティブSQLクエリを使用していますが、この質問はおそらく名前付きHQLクエリにも当てはまります。
これに対する答えは「いいえ」であると確信していますが、ドキュメントで決定的な答えをまだ見つけていません。
前に参照した質問に対する別の回答で述べたように、次のHQL構成が機能します。
select o from Product o WHERE :value is null or o.category = :value
:value
として渡された場合null
、すべての製品が返されます。
オプションまたはヌルパラメータも参照してください。
このバグが原因で、Sybaseの一部のバージョンでは機能しないことに注意してください。そのため、次の方法があります。
select o from Product o WHERE isnull(:value, 1) = 1 or o.category = :value
AFAIK、そのようなことはないので、これに対して動的クエリを作成する必要があります。たぶん、HQLでこれを行う方法(SQLに転置できる)を示し、Criteria APIがそれをより単純にし、したがって私の意見ではこの仕事により適していることを示すこの以前の回答を見てください。
更新: (OPからのコメントに答える)レガシーデータベースでの作業は、Hibernateでは確かに難しい場合があります。おそらく、動的なネイティブクエリを使用して、管理されていないエンティティを返すことができます。しかし、長期的には、事態は悪化する可能性があります(私はあなたのためにそれを言うことはできません)。たぶん、Hibernateはあなたの場合には最良の選択ではなく、iBATISのようなものはあなたに必要な柔軟性を与えるでしょう。
残念ながら、「オプションまたはヌルパラメータ」の解決策はINリストでは機能しません。次のようにクエリを変更する必要がありました...
名前付きクエリ定義:
select ls from KiCOHeader co
...
join lu.handlingType ht
where (:inHandlingTypesX = 1 OR ht.name in (:inHandlingTypes))
コード:
Set<KiHandlingTypeEnum> inHandlingTypes = ...
Query query = persistence.getEm().createNamedQuery("NAMED_QUERY");
query.setParameter("inHandlingTypesX", (inHandlingTypes == null) ? 1 : 0);
query.setParameter("inHandlingTypes", inHandlingTypes);
List<KiLogicalStock> stocks = query.getResultList();
とても楽しい仕事です。
オプションのリストパラメータを処理するための別の解決策は、COALESCE関数を使用してnullをチェックすることです。COALESCEはHibernateでサポートされており、リストから最初のnull以外のパラメーターを返します。これにより、リストに複数の項目がある場合に構文を壊すことなく、リストでnullをチェックできます。
オプションのパラメーターとリストパラメーターを使用したHQLの例:
select obj from MyEntity obj
where ( COALESCE( null, :listParameter ) is null or obj.field1 in (:listParameter) )
and ( :parameter is null or obj.field2 = :parameter )
これは、SQLServerの方言でうまくいきました。
NULL値に問題がある場合、別のオプションは代替値を使用することです。私の場合、カテゴリフィールドには正の値のみを使用しました。これにより、代替値=-1として使用できます。
したがって、クエリを実行する前に、簡単な検証を行うことができます。
if(value==null) {
value = -1;
}
....
....
select p from Product p WHERE :value = -1 or p.category = :value