【问题标题】:Correct way to count associated objects using JPQL使用 JPQL 计算关联对象的正确方法
【发布时间】:2011-03-31 09:06:29
【问题描述】:

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

【问题讨论】:

    标签: java hibernate orm jpa jpql


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢 Pascal,在某些时候我将不得不坐下来记住 JPA 规范。当您知道自己在寻找什么时,它确实会有所帮助。
    • @corydoras:不客气。而且我只能建议下载规范并完整阅读(它不是那么大,可以跳过XML映射之类的部分)。
    猜你喜欢
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2020-01-30
    • 1970-01-01
    • 2022-11-09
    相关资源
    最近更新 更多