jpql减去两个count函数的结果

Posted

技术标签:

【中文标题】jpql减去两个count函数的结果【英文标题】:jpql subtract the results of two count functions 【发布时间】:2013-09-24 23:31:20 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

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

以上是关于jpql减去两个count函数的结果的主要内容,如果未能解决你的问题,请参考以下文章

减去两个查询结果

为啥 spark 中的 sample 和减去方法会给出这样的结果

熊猫:减去两个日期列,结果是一个整数

python编写函数判断两个整数加减乘除运算结果是不是正确

ORACLE 两个表或两个结果集的数据对比常用的函数

我可以将 JPQL 的结果限制为只返回一个结果吗?