首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >利用HQL中远程相关集合的属性检索父元素?

利用HQL中远程相关集合的属性检索父元素?
EN

Stack Overflow用户
提问于 2011-10-21 06:10:00
回答 2查看 480关注 0票数 0

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

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

在我的类结构中,A有对B的引用,B有对C的引用,C有一个D的集合(一对多),D有对E的引用。

代码语言:javascript
运行
复制
       />D->E
A->B->C->D->E
       \>D->E
        ...

在数据库中,D是一个关系表,它存储C和E的外键(集合由反向属性D.C映射)。

我需要一个所有的列表,因为D的远相关集合包含一个与特定E相关的D。我做了这个伪查询(在MySQL中类似的查询)来说明这个问题:

代码语言:javascript
运行
复制
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中显然没有“on”。我尝试了我在教程中找到的带有语法的变体,但是hibernate总是抛出一些模糊的错误或另一个错误(不能取消引用集合、无效的令牌、属性没有映射--尽管是这样,等等)。主要的问题似乎是,我不需要通过存在集合(D)的实际元素来过滤,而需要通过一个属性(E)来过滤。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-21 06:55:14

在HQL中不需要on,因为HQL用于遍历实体关联,Hibernate已经知道这些关联是如何映射到数据库中的。因此,它为您在生成的SQL中插入on子句。你必须从实体及其关联的角度来思考,而不是从表格的角度来思考。所以你的查询应该是

代码语言:javascript
运行
复制
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需要非空来满足条件,所以使用左联接是没有意义的。内部连接通常更有表现力。

票数 0
EN

Stack Overflow用户

发布于 2011-10-21 06:50:00

您需要下面这样的内容(没有测试)

代码语言:javascript
运行
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7845603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档