Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.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
Java 在HQL中通过远程相关集合的属性检索父元素?_Java_Mysql_Hibernate_Hql - Fatal编程技术网

Java 在HQL中通过远程相关集合的属性检索父元素?

Java 在HQL中通过远程相关集合的属性检索父元素?,java,mysql,hibernate,hql,Java,Mysql,Hibernate,Hql,大家早上好。我需要一些查询帮助。您可以假设我理解相对复杂的SQL查询,但这种新颖的HQL东西让我有点困惑 我有5个对象,A到E。我将使用小写字母A到E来表示这些对象中指向相同大写类型对象的属性 在我的类结构中,A引用了B,B引用了C,C引用了D的一对多集合,D引用了E />D->E A->B->C->D->E \>D->E ... 在数据库上,D是一个关系表,它存储C和E的外键。集合由反向属性D.C映射

大家早上好。我需要一些查询帮助。您可以假设我理解相对复杂的SQL查询,但这种新颖的HQL东西让我有点困惑

我有5个对象,A到E。我将使用小写字母A到E来表示这些对象中指向相同大写类型对象的属性

在我的类结构中,A引用了B,B引用了C,C引用了D的一对多集合,D引用了E

       />D->E
A->B->C->D->E
       \>D->E
        ...
在数据库上,D是一个关系表,它存储C和E的外键。集合由反向属性D.C映射

我需要一个所有As的列表,这些As的远亲D集合包含一个与特定E相关的D。我制作了一个类似的伪查询,在MySQL中可以用来说明这个问题:

select A
from D
left join E on D.e = E
left join C on D.c = C
left join B on B.c = C
left join A on A.b = B
where E = myfilter
但是,这不起作用,因为HQL中显然没有“开”。我尝试了在教程中找到的带有语法的变体,但hibernate总是抛出一些模糊的错误或其他无法取消引用集合、无效标记、属性未映射的错误-即使是,主要的问题似乎是,我不需要通过集合D的实际元素的存在进行过滤,而是通过一个E的属性进行过滤


有人知道如何帮助吗?如果您需要澄清,请留下评论。

您需要以下未经测试的内容

Select a
From A as a
Left outer join A.b as B
Left outer join B.c as C
Left outer join c.DList as D // DList is the name of the property that is a list of D
Left outer join D.e as E
Where e == filter
HQL中不需要on,因为HQL用于遍历实体关联,Hibernate已经知道关联在数据库中的映射方式。因此,它在为您生成的SQL中插入on子句。你必须从实体及其关联的角度来思考,而不是从表格的角度来思考。因此,您的查询应该是

select a from A a
inner join a.b b
inner join b.c c
inner join c.listOfDs d
inner join d.e e
where e.someProperty = :someValue

因为e需要不为null才能满足条件,所以使用左连接没有意义。内部联接通常性能更高。

QuerySyntaxException:无效路径:D.equalySyntaxException:无效路径:null.bGah。无法发布自我解决方案,因为某些声誉白痴。这就是解决方案,除了直接路径可以用a.b.c等缩短。问题显然是我需要一个别名,因为HQL在分配别名时发挥了神奇的作用。谢谢