1

コレクションをパラメーターとして渡したいクエリを作成しています。

List<String> items = new LinkedList();
//adding optional items
Query query = s.getNamedQuery("myQueryName").setParameterList("item", items);

私のクエリは次のようになります。

SELECT i from Item i
//... not important things
WHERE ( i.name in (:item) )

オプションにしたいので、アイテムリストは空になる可能性があります。しかし、空の場合、例外が発生します。

org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected end of subtree

だから私は次のようないくつかの機能を使用しようとしました:

SELECT i from Item i
//... not important things
WHERE ( (:item) is null or i.name in (:item) )

SELECT i from Item i
//... not important things
WHERE ( (:item) is empty or i.name in (:item) )

SELECT i from Item i
//... not important things
WHERE ( size(:item)=0 or i.name in (:item) )

しかし、どれも機能していないようです。リストが空でない場合にのみ、この問題を解決し、アイテム名がリストにあるかどうかを確認するにはどうすればよいですか?

4

2 に答える 2

3

true を返さないことがわかっている値をリストに追加できます。たとえば、整数のリストがあり、そのリストに ID が含まれているかどうかを確認したいとします。リストに「-1」を追加すると、希望どおりに機能するはずです。文字列の例では、決して発生しないランダムな文字列を追加するだけです。

何かのようなもの:

List<String> items = new LinkedList();
items.add("**BLAHBLAH_YO_MAMMA_SO_SLEAZY_SHE_ALWAYS_RETURN_TRUE**");
//add optional items
Query query = s.getNamedQuery("myQueryName").setParameterList("item", items);
于 2012-11-26T22:25:52.070 に答える
2

それは、SQL の設計上の問題であり、SQL に直接変換されるため、もちろん HQL にも存在します。

HQL でこれを処理する簡単な解決策はありません。最も簡単で効率的な方法は、クエリを生成して実行する前にリストをチェックすることです。

多くの場合、次のことを行うだけです。

if (items.isEmpty()) {
    return Collections.emptyList();
}

あなたの場合、基準クエリ (またはクエリを動的に構築するために使用される別の API) を使用し、クエリを動的に構築します。

Criteria c = session.createCriteria(Item.class, i);
...
if (!items.isEmpty()) {
    c.add(Restrictions.in("i.name", items));
}
return c.list();
于 2012-11-26T21:59:56.323 に答える