Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa jpql减去两个计数函数的结果_Jpa_Collections_Size_Many To Many_Jpql - Fatal编程技术网

Jpa jpql减去两个计数函数的结果

Jpa jpql减去两个计数函数的结果,jpa,collections,size,many-to-many,jpql,Jpa,Collections,Size,Many To Many,Jpql,请看一下这篇文章的结尾(找到了另一种但也不起作用的方式)。第二种方法应该更好,如果有一天它能起作用;) 我有一个由两个多对多关系组成的实体: MainEntity有许多As和B,其中A和B属于同一类型。 以下JQL的示例:如果“ob”有4个“As”和5个“Bs”,我需要占位符“difference”中的-1结果,但它总是返回0。使用外部联接也是一样的 String query = "SELECT ob, (COUNT(A) - COUNT(B)) difference" +

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

我有一个由两个多对多关系组成的实体: MainEntity有许多As和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"
SELECT SIZE(ob.listA) FROM MainEntity ob WHERE ob=:PARAM
如果ob的列表“listA”中有5项,则返回5。有人能帮我构造正确的JPQL吗

编辑: 这是有效的:

"SELECT COUNT(A) FROM MainEntity ob JOIN ob.listA A "
        + "WHERE ob=:PARAM"
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)
SELECT SIZE(ob.listA) - SIZE(ob.listA) 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)
SELECT SIZE(ob.listA) - SIZE(ob.listA) FROM MainEntity ob WHERE ob=:PARAM

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

谢谢您的回答!我认为,如果你的答案是正确的,那么计数的参数就没有意义了。但是Count是一个只允许一个参数的函数。Count()计算非空值您是对的!我想计算“ListA”列中的非空值,并减去“ListB”列中非空值的计算值。现在我找到了另一种(不起作用的)方法;)看看编辑,我认为萨米是对的。JPQL并不像我预期的那么强大。为了查询更复杂的数据,我将在将来使用本机SQL。JPA还提供了从本机SQL查询创建对象的良好功能,这使我仍然相信JPA。