3

この投稿の最後をご覧ください (別の方法が見つかりましたが、機能していません)。この2番目の方法は、いつか機能する場合、より良い方法になるはずです;)

MainEntity には多くの As があり、MainEntity には多くの B があり、A と B は同じ型です。次の JQL の例: "ob" に 4 つの "As" と 5 つの "B" がある場合、プレースホルダー "difference" に -1 の結果が必要ですが、常に 0 を返します。Outer Join を使用しても同じです。

   String query = "SELECT ob, (COUNT(A) - COUNT(B)) difference" +
        + " FROM MainEntity ob "
        + " JOIN ob.listA A "
        + " JOIN ob.listB B "
        + " GROUP BY ob "
        + " WHERE ob=:PARAM ";

次の例が機能しています。

"SELECT COUNT(A) FROM MainEntity ob JOIN ob.listA A "
        + "WHERE ob=:PARAM"

ob のリスト "listA" に 5 つの項目がある場合、5 を返します。正しいJPQLを構築するのを手伝ってくれる人はいますか?

編集: これは機能しています:

SELECT SIZE(ob.listA) FROM MainEntity ob WHERE ob=:PARAM

だから、これもうまくいくと思った:

SELECT SIZE(ob.listA) - SIZE(ob.listB) FROM MainEntity ob WHERE ob=:PARAM

しかし、それは機能しません-私にとって混乱しています! この JPQL は、次の例外をスローします。

Caused by: Exception [EclipseLink-6069] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.QueryException
Exception Description: The field [ENTITYINFOERWEITERUNG.ID] in this expression has an invalid table in this context.
        at org.eclipse.persistence.exceptions.QueryException.invalidTableForFieldInExpression(QueryException.java:722)

次の JPQL は同じ例外をスローするため、面白いと思います。

SELECT SIZE(ob.listA) - SIZE(ob.listA) FROM MainEntity ob WHERE ob=:PARAM
4

1 に答える 1

0

1 つの選択で 2 つのカウントを取得するには、select 句でサブクエリを使用する必要があります。残念ながら、JPA は select 句でのサブクエリをサポートしていません。オプションは、2 つのクエリまたはネイティブ SQL を使用することです。

于 2013-09-19T20:17:31.760 に答える