使用JPQL计算关联对象的正确方法

cor*_*ras 7 java orm hibernate jpa jpql

编写此JPA查询的正确方法是什么?我只是猜测,因为我无法解决它或在我的JPA书中找到它.

Query query=em.createQuery("select m from Meeting m where count(m.attendees) = 0");
return query.getResultList();
Run Code Online (Sandbox Code Playgroud)

我目前正在尝试使用Hibernate,我得到一个mysql错误!

ERROR org.hibernate.util.JDBCExceptionReporter - You have an error in your
SQL syntax; check the manual that corresponds to your MySQL server version
for the right syntax to use near ')=0' at line 1
Run Code Online (Sandbox Code Playgroud)

Pas*_*ent 11

要严格回答问题的标题,请使用SIZE:

Query query=em.createQuery("select m from Meeting m where size(m.attendees) = 0");
return query.getResultList();
Run Code Online (Sandbox Code Playgroud)

从JPA规范:

4.6.16.2算术函数

functions_returning_numerics::=
ABS(simple_arithmetic_expression) |
SQRT(simple_arithmetic_expression) |
MOD(simple_arithmetic_expression, simple_arithmetic_expression) |
SIZE(collection_valued_path_expression)
Run Code Online (Sandbox Code Playgroud)

ABS函数接受一个数字参数,并返回与函数参数相同类型的数字(整数,浮点数或双精度).

SQRT函数接受一个数字参数并返回一个double.

MOD函数接受两个整数参数并返回一个整数.

SIZE函数返回一个整数值,即集合的元素数.如果集合为空,则SIZE函数的计算结果为零.

这些函数的数字参数可以对应于数字Java对象类型以及原始数字类型.

在特定情况下0,您也可以使用IS EMPTY

4.6.11空集合比较表达式

IS EMPTYempty_collection_comparison_expression中使用比较运算符的语法 如下:

collection_valued_path_expression IS [NOT] EMPTY
Run Code Online (Sandbox Code Playgroud)

此表达式测试由集合值路径表达式指定的集合是否为空(即,没有元素).

例:

SELECT o
FROM Order o
WHERE o.lineItems IS EMPTY
Run Code Online (Sandbox Code Playgroud)

如果空集合比较表达式中的集合值路径表达式的值未知,则空比较表达式的值是未知的.

我会测试两者以确定哪一个是最有效的(检查查询计划).