Hibernate ?ネイティブ [〜#〜] sql [〜#〜] クエリを使用していますが、質問はおそらく名前付き [〜#〜] hql [〜#〜] クエリも同様です。
私はこれに対する答えが「いいえ」であることを確信していますが、私はまだドキュメントで決定的な答えを見つけていません。
私の知る限り、そのようなことはないので、このための動的なクエリを作成する必要があります。多分これを見てください 前の回答 HQLでこれを行う方法を示し(SQLに移すことができます)、またCriteria APIがどのようにシンプルになり、私の仕事でこの仕事に適しているかを示します意見。
Update:(OPからのコメントへの回答)Hibernateでは、レガシーデータベースでの作業は本当に難しい場合があります。たぶん、動的なネイティブクエリを使用して、 非管理エンティティ を返すことができます。しかし、長い目で見れば、事態はさらに悪化するかもしれません(私はあなたにそれを伝えることはできません)。おそらくHibernateはあなたの場合には最良の選択ではなく、iBATISのようなものはあなたに必要な柔軟性を与えるでしょう。
前述の question の 異なる回答 で述べたように、次のHQL構造が機能します。
select o from Product o WHERE :value is null or o.category = :value
if :value
はnull
として渡され、すべての製品が返されます。
オプションまたはNullパラメーター も参照してください
このバグ が原因で、これはSybaseの一部のバージョンでは機能しないことに注意してください。そのため、以下が代替手段です。
select o from Product o WHERE isnull(:value, 1) = 1 or o.category = :value
残念ながら、「オプションまたはヌルパラメータ」の下のソリューションは、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 )
これは、SQL Serverの方言でうまくいきました。
NULL値に問題がある場合は、別の値を使用することもできます。私の場合、カテゴリフィールドに正の値のみを使用したため、代替値= -1として使用できます。
したがって、クエリを実行する前に、小さな検証を行うことができます。
if(value==null) {
value = -1;
}
....
....
select p from Product p WHERE :value = -1 or p.category = :value