jpa - jpql 减去两个计数函数的结果

标签 jpa collections size many-to-many jpql

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

我有一个由两个多对多关系组成的实体: MainEntity 有很多 A,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

最佳答案

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

关于jpa - jpql 减去两个计数函数的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18902171/

相关文章:

java - 使用 java Collections 比较和排序不同类型的对象

c# - 固定尺寸列表

java - 如何计算一个对象使用了多少 RAM?

java - 奇怪的 JFrame 大小

database - JPA - 计算列作为实体类属性?

java - 在测试中注入(inject) EntityManager 时,Powermock 和 Spring 导致 ConversionException

java - 如何正确地从数据库刷新过时的实体?

scala - 如何通过子序列拆分序列?

c++ - 二叉树 - 计算不同的节点

java - 使用 Maven 和 Java 5 (JPA) 进行注释处理