JPQL WHERE子句中的实体比较如何工作?

sie*_*rre 4 hibernate jpa where

在JPQL中如何评估实体比较(相等)语句:是通过身份比较,equals()还是其他方式?

我花了几个小时的时间来仔细研究Hibernate和JPA的规范,但仍然找不到它的工作方式。考虑以下实体:

class MyProductType{Integer id;}
class MyProduct{Integer id; MyProductType pType;}
Run Code Online (Sandbox Code Playgroud)

现在是JPQL / HQL查询:

SELECT t FROM MyProductType t, MyProduct p WHERE p.pType = t
Run Code Online (Sandbox Code Playgroud)

(我知道这是一个丑陋的查询,只关注where子句的语义。)

那么如何p.pType = t评估?

JSR 317提到了“ entity_expression”比较,但是其行为尚不清楚。

编辑:我不喜欢Rika的以下建议是.id方法包括隐式内部联接,如果查询使用外部(LEFT)联接,通常这不是您想要的。

Rik*_*ika 5

我在http://www.objectdb.com/java/jpa/query/jpql/comparison上找到了它,这是非常有趣的好问题。

可以使用相等运算符(=,<>,==,!=)比较用户定义类(实体类和可嵌入类)的实例。对于实体,如果e1和e2具有相同的类型和相同的主键值,则e1 = e2。对于可嵌入对象,如果e1和e2的内容完全相同,则e1 = e2。

因此,它似乎检查对象的主键值和对象的类型。如此看来,在p.pType = t的情况下,它将检查p.pType的ID(假设id是主键),其id为t,看它们是否相等。然后它将检查两个实体的类型或MyProductType是否相同。

  • 我也发现了。但它适用于 ObjectDB 而不是一般的 JPA。感谢您的评论。使用 Hibernate 进行一些调试后,我发现实体比较转换为与 JPQL 中的 .id 比较完全相同的 SQL。所以我想我会在几天内将您的答案标记为已接受(如果没有其他答案)。 (2认同)