实体比较如何在JPQL WHERE子句中起作用?

时间:2014-10-10 13:05:08

标签: hibernate jpa where

如何在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方法包括隐式内连接,如果查询使用OUTER(LEFT)连接,通常不是你想要的。

2 个答案:

答案 0 :(得分:3)

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

  

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

因此它似乎检查对象的主键值和对象的类型。因此,似乎p.pType = t,它将检查(假设id是主键)p.pType的id,id为t并查看它们是否相等。然后它将检查两个实体是否属于同一类型或MyProductType。

答案 1 :(得分:0)

我在使用EclipseLink和MySQL DB的NetBeans环境中做了同样的事情。生成的SQL语句使用外键(在类的表中,引用另一个类的对象)和引用对象的主键值。