質問

を使用するときに名前付きクエリでオプションのパラメーター (検索パラメーターがフォームから提供され、すべてのパラメーターが必須ではない場合など) を指定する方法はありますか? 休止状態?ネイティブを使用しています SQL クエリですが、この質問はおそらく名前付きのクエリに当てはまります。 本社 クエリも同様です。

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

役に立ちましたか?

解決

私の知る限り、そのようなものは存在しないため、これには動的クエリを作成する必要があります。たぶんこれを見てください 前の回答 これを 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
:valuenullとして渡された場合、全ての製品が返されます。

も参照してください。オプションまたは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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top