0

エンティティ オファーがあり、2 つのフィールドの組み合わせで名前付きクエリを作成する必要があります。

フィールド pr_id および of_id。

したがって、実際のクエリは次のようになります

 Select pr_id, of_id, a, b from Offers 
  where ( (pr_id=1 and of_id=2) 
     or   (pr_id=2 and of_id=1)
     or  (pr_id=1 and of_id=2))

「and」は他の結果に基づいて増加します。最大 10 ですが、この質問には関係ありません。値は明らかにパラメータです。

ライブラリメソッドを呼び出す必要があります

    findByNamedQuery( QueryName, Map<String, Object>)   or 
    findByQuery(query)

上記の方法は変更できません。最初のものを使用すると、フィールド名と動的パラメーター名が JPA のクエリで繰り返される場合にどのように機能するかわかりません。

たとえばJPAの場合、次のようになります。

    map("pr_id",":pr_id");
    map("of_id",":of_id");
    map("pr_id",":pr_id");
    map("of_id",":of_id");
    map("pr_id",":pr_id");
    map("of_id",":of_id");

だから私は2番目のオプションしかないと思いますか?実際のクエリとまったく同じように、実際の値を動的に使用してクエリを作成します。

1番目のものを使用する方法はありますか?

4

1 に答える 1

0

クエリをどのように作成しますか? 問題は、パラメーター マップにデータを入力する方法に関するものですが、それは、クエリでパラメーターにどのように名前を付けるかによって異なります。探している異なる値ごとに異なるパラメーター名が必要です。

「OR」条件の数は可変であることを理解しているため、静的な名前付きクエリを使用できないため、findByNamedQuery メソッドを使用できませんでした。

JPQL を使用してクエリ文字列を動的に作成できます。

SELECT pr_id, of_id, a, b FROM Offers 
WHERE((pr_id=:pr_id_1 and of_id=:of_id_1) 
 OR   (pr_id=:pr_id_2 and of_id=:of_id_2)
 OR   (pr_id=:pr_id_3 and of_id=:of_id_3))

そして、各パラメータを渡します:

...
query.setParameter(pr_id_1, 4534);
query.setParameter(pr_id_2, 6368);
query.setParameter(pr_id_3, 2345);
...

または、Criteria API を使用して、タイプ セーフな方法で動的クエリを作成することもできます

于 2013-06-07T15:23:32.457 に答える