7

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

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

我目前正在使用 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
4

1 回答 1

12

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

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

从 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)

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

SQRT 函数接受一个数字参数并返回一个双精度值。

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

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

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

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

4.6.11 空集合比较表达式

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

collection_valued_path_expression IS [NOT] EMPTY

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

例子:

SELECT o
FROM Order o
WHERE o.lineItems IS EMPTY

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

我会测试两者以查看哪个最有效(检查查询计划)。

于 2010-08-18T08:16:10.140 回答