Hibernate の名前付きクエリのオプションのパラメータ?
-
20-09-2019 - |
解決
私の知る限り、そのようなものは存在しないため、これには動的クエリを作成する必要があります。たぶんこれを見てください 前の回答 これを HQL で行う方法 (SQL に転置できる) を示し、私の意見では、Criteria API がどのようにそれを簡素化し、この仕事により適しているかを示します。
アップデート: (OP からのコメントに答える) Hibernate を使用して従来のデータベースを操作するのは確かに難しい場合があります。おそらく、動的ネイティブクエリを使用して返すことができます 管理されていないエンティティ けれど。しかし、長期的には状況はさらに悪化する可能性があります(私にはそれがわかりません)。おそらく、あなたのケースでは Hibernate が最良の選択ではなく、iBATIS のようなものが必要な柔軟性を与えてくれるでしょう。
他のヒント
をhref="https://stackoverflow.com/a/2725096/456956">以前に参照2437053 / JPA-where節、任意の ">質問を、以下のHQL私の作品を構築します:
select o from Product o WHERE :value is null or o.category = :value
:value
がnull
として渡された場合、全ての製品が返されます。
も参照してください。オプションまたはNullパラメータの
これが原因このバグへのSybaseの一部のバージョンでは動作しないことに注意してください、そう次の代替です。
select o from Product o WHERE isnull(:value, 1) = 1 or o.category = :value
残念ながら「オプションまたはNullパラメータ」の下のソリューションは、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();
働いて楽しかっます。
オプションのリストパラメータを処理するための別の解決策は、<のhref =「http://docs.oracle.com/cd/B28359_01/server.111/b28286/functions023.htm」のrel = "nofollowをを使用してnullをチェックすることです「> の機能をCOALESCE。 COALESCEは、休止するによってサポートされていますあなたは、リスト内の複数の項目がある構文を壊すことなく、リストに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