3

请看一下这篇文章的结尾(找到另一种但也不起作用的方法)。如果有一天它起作用的话,第二种方法应该是更好的方法;)

我有一个由两个多对多关系组成的实体:MainEntity 有许多 As,MainEntity 有许多 B,其中 A 和 B 属于同一类型。以下 JQL 的示例:如果“ob”有 4 个“As”和 5 个“Bs”,我需要占位符“difference”中的 -1 结果,但它总是返回 0。使用外连接也是如此。

   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

您需要在 select 子句中使用子查询来通过一次选择获得两个计数。不幸的是,JPA 不支持 select 子句中的子查询。您的选择是使用两个查询或本机 sql。

于 2013-09-19T20:17:31.760 回答