HQL 多重右连接与可选的@ManyToOne
HQL multiple right joins with optional @ManyToOne
我有一个如下所示的数据模型:
Singer {}
Concert {
@ManyToOne
Singer singer;
}
Fan {
@ManyToOne
Singer singer;
}
现在我想得到所有歌手、他们的演唱会和歌迷的组合列表(当然这只是一个例子)。我想要所有的歌手,即使他们没有演唱会或歌迷。我在 HQL 中这样尝试过:
SELECT s, c, f FROM Concert c RIGHT JOIN c.singer s, Fan f RIGHT JOIN f.singer s1 WHERE s=s1
然而,当歌手没有粉丝或演唱会时,此查询不会返回他,因为带有空粉丝集合的叉积似乎是在粉丝与歌手右连接之前构建的。
我该如何解决?
谢谢!
嗯,我认为你应该通过改变你的方法来面对这个问题。尝试使用实体关系,像这样:
Singer {
@OneToMany(mappedBy = "singer", fetch = FetchType.LAZY)
Set<Concert> concerts;
@OneToMany(mappedBy = "singer", fetch = FetchType.LAZY)
Set<Fan> fans;
}
并且,您的 HQL 更改为:
select s from Singer s
join fetch s.concerts
join fetch s.fans
当您搜索歌手时,hibernate 将获取与歌手相关的 fans
和 concerts
。如果 Singer 没有相关数据,将实例化 Empty Sets。
我有一个如下所示的数据模型:
Singer {}
Concert {
@ManyToOne
Singer singer;
}
Fan {
@ManyToOne
Singer singer;
}
现在我想得到所有歌手、他们的演唱会和歌迷的组合列表(当然这只是一个例子)。我想要所有的歌手,即使他们没有演唱会或歌迷。我在 HQL 中这样尝试过:
SELECT s, c, f FROM Concert c RIGHT JOIN c.singer s, Fan f RIGHT JOIN f.singer s1 WHERE s=s1
然而,当歌手没有粉丝或演唱会时,此查询不会返回他,因为带有空粉丝集合的叉积似乎是在粉丝与歌手右连接之前构建的。
我该如何解决? 谢谢!
嗯,我认为你应该通过改变你的方法来面对这个问题。尝试使用实体关系,像这样:
Singer {
@OneToMany(mappedBy = "singer", fetch = FetchType.LAZY)
Set<Concert> concerts;
@OneToMany(mappedBy = "singer", fetch = FetchType.LAZY)
Set<Fan> fans;
}
并且,您的 HQL 更改为:
select s from Singer s
join fetch s.concerts
join fetch s.fans
当您搜索歌手时,hibernate 将获取与歌手相关的 fans
和 concerts
。如果 Singer 没有相关数据,将实例化 Empty Sets。