web-dev-qa-db-ja.com

Hibernateの名前付きクエリのオプションパラメータ?

Hibernate ?ネイティブ [〜#〜] sql [〜#〜] クエリを使用していますが、質問はおそらく名前付き [〜#〜] hql [〜#〜] クエリも同様です。

私はこれに対する答えが「いいえ」であることを確信していますが、私はまだドキュメントで決定的な答えを見つけていません。

30
Ickster

私の知る限り、そのようなことはないので、このための動的なクエリを作成する必要があります。多分これを見てください 前の回答 HQLでこれを行う方法を示し(SQLに移すことができます)、またCriteria APIがどのようにシンプルになり、私の仕事でこの仕事に適しているかを示します意見。

Update:(OPからのコメントへの回答)Hibernateでは、レガシーデータベースでの作業は本当に難しい場合があります。たぶん、動的なネイティブクエリを使用して、 非管理エンティティ を返すことができます。しかし、長い目で見れば、事態はさらに悪化するかもしれません(私はあなたにそれを伝えることはできません)。おそらくHibernateはあなたの場合には最良の選択ではなく、iBATISのようなものはあなたに必要な柔軟性を与えるでしょう。

14
Pascal Thivent

前述の question異なる回答 で述べたように、次のHQL構造が機能します。

select o from Product o WHERE :value is null or o.category = :value

if :valuenullとして渡され、すべての製品が返されます。

オプションまたはNullパラメーター も参照してください

このバグ が原因で、これはSybaseの一部のバージョンでは機能しないことに注意してください。そのため、以下が代替手段です。

select o from Product o WHERE isnull(:value, 1) = 1 or o.category = :value
38
Ian Jones

残念ながら、「オプションまたはヌルパラメータ」の下のソリューションは、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();

とても楽しい仕事です。

7
Kosima

オプションのリストパラメータを処理する別のソリューションは、 [〜#〜] 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の方言でうまくいきました。

3
Jon Williams

NULL値に問題がある場合は、別の値を使用することもできます。私の場合、カテゴリフィールドに正の値のみを使用したため、代替値= -1として使用できます。

したがって、クエリを実行する前に、小さな検証を行うことができます。

if(value==null) {
   value = -1;
}
....
....
select p from Product p WHERE :value = -1 or p.category = :value
0
georgeos