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

时间:2010-08-18 06:13:42

标签: java hibernate orm jpa jpql

编写此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

1 个答案:

答案 0 :(得分:11)

要严格回答问题的标题,请使用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 EMPTY    empty_collection_comparison_expression   如下:

collection_valued_path_expression IS [NOT] EMPTY
     

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

     

示例:

SELECT o
FROM Order o
WHERE o.lineItems IS EMPTY
     

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

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