Hibernate 在JPQL WHERE子句中实体比较是如何工作的?
在JPQL中实体比较(相等)语句是如何计算的:是通过身份比较,还是通过equals()或其他方式 我花了几个小时在谷歌上搜索并浏览了Hibernate和JPA的规范,但仍然找不到它是如何工作的。考虑以下实体:Hibernate 在JPQL WHERE子句中实体比较是如何工作的?,hibernate,jpa,where,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 WHE
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
是如何评估的呢
JSR317提到了“实体_表达式”比较,但其行为并未得到澄清
编辑:我不喜欢Rika下面的建议,.id方法包括隐式内部连接,如果查询使用外部(左)连接,这通常不是您想要的。我发现这是一个非常有趣的好问题
用户定义类(实体类和可嵌入类)的实例
类)可以通过使用相等运算符(=,==,
!=). 对于实体,如果e1和e2具有相同的类型且
相同的主键值。对于可嵌入对象,如果e1和e2
内容完全相同
所以它似乎检查了对象的主键值和对象的类型。因此,对于p.pType=t,它将检查p.pType的id(假设id是主键)和t的id,看看它们是否相等。然后,它将检查这两个实体是属于同一类型还是MyProductType 我在使用EclipseLink和MySQL数据库的NetBeans环境中也做了同样的事情。生成的SQL语句使用外键(在引用另一个类的对象的类的表中)和被引用对象的主键值。该查询有效吗?我之所以问这个问题,是因为通常人们会看到p.pType.id=t.id或者类似的东西。因为您仍在从数据库进行查询,而数据库本身不在对象中。这是一个简化的示例查询。我目前的实际情况要复杂得多。但是,它确实适用于实体比较。问题是它是如何工作的(JPA是按照您描述的那样进行id比较,还是在实体上使用equals()。我想弄清楚的是,我是否可以依赖简短的语法,或者我必须按照你的建议执行完整的ID语句。我也发现了这一点。但它是针对ObjectDB的,而不是一般的JPA。谢谢你的评论。在使用Hibernate进行一些调试之后,我发现实体比较转换为与JPQL中的.id比较完全相同的SQL。所以,如果几天内没有其他答案,我想我会把你的答案标记为接受。