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 将获取与歌手相关的 fansconcerts。如果 Singer 没有相关数据,将实例化 Empty Sets。