Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 在JPQL WHERE子句中实体比较是如何工作的?_Hibernate_Jpa_Where - Fatal编程技术网

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

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

在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
是如何评估的呢

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。所以,如果几天内没有其他答案,我想我会把你的答案标记为接受。