【发布时间】:2014-12-05 16:00:34
【问题描述】:
在 JPQL 中如何评估实体比较(相等)语句:是通过身份比较,还是通过 equals() 或其他方式?
我花了几个小时在谷歌上搜索并浏览了 Hibernate 和 JPA 的规范,但仍然找不到它是如何工作的。考虑以下实体:
class MyProductType{Integer id;}
class MyProduct{Integer id; MyProductType pType;}
现在是 JPQL/HQL 查询:
SELECT t FROM MyProductType t, MyProduct p WHERE p.pType = t
(我知道这是一个丑陋的查询,只关注 where 子句语义。)
那么p.pType = t 是如何评估的呢?
JSR 317 提到了“entity_expression”比较,但它的行为并未明确。
编辑:我不喜欢 Rika 下面的建议是 .id 方法包括隐式内部联接,如果查询使用外部(左)联接,这通常不是您想要的。
【问题讨论】:
-
该查询有效吗?我问的原因是因为通常人们会看到 p.pType.id = t.id 或类似的东西。因为你还在从数据库中查询,而数据库本身不在对象中。
-
这是一个简化的示例查询。我目前的实际情况要复杂得多。但是是的,它适用于实体比较。问题是它是如何工作的(JPA 是按照您的描述进行 id 比较还是在实体上使用 equals() )。我想弄清楚的是我是否可以依赖简短的语法,或者我必须按照您的建议执行完整的 ID 语句。