2014-10-10 63 views
4

如何在JPQL中评估实体比较(相等)语句:是通过身份比较还是通过equals()或其他?实体比较如何在JPQL WHERE子句中起作用?

我花了几个小时的谷歌搜索和通过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方法包括隐式内部联接,通常不是你想要的情况下查询使用外(左)连接。

+0

查询是否有效?我之所以问这个问题,是因为通常会看到p.pType.id = t.id或其他类似的东西。因为您仍然从数据库中查询,并且数据库本身不在对象中。 – Rika 2014-10-10 13:40:53

+0

这是一个简化的示例查询。我目前的实际情况要复杂得多。但是,它适用于实体比较。问题在于它是如何工作的(JPA是否按照您所描述的那样进行了id比较,或者它对实体使用了equals())。我想弄清楚的是,我能否依靠简短的语法,或者我不得不按照你的建议去做完整的ID声明。 – sierre 2014-10-10 13:48:25

回答

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。

+0

我也发现了。但是它一般用于ObjectDB而不是JPA。感谢您的评论。 在用Hibernate进行一些调试后,我发现实体比较转换为与JPQL中的.id比较完全相同的SQL。所以我想我会标记你的答案,如果没有其他人在几天内接受。 – sierre 2014-10-10 15:24:00

0

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