【问题标题】:Why is Hibernate using OUTER joins为什么 Hibernate 使用 OUTER 连接
【发布时间】:2019-03-08 16:38:07
【问题描述】:

我正在使用 Hibernate 4.3.11.Final 和 H2(基于磁盘)数据库

关键的 Hibernate 类是

public class Song
{
    @Id
    private Integer recNo;

    ....
    @OneToMany(fetch=FetchType.EAGER, cascade={CascadeType.ALL})
    private List<CoverArt> coverArts;
}

public class CoverArt
{
    @Id
    @GeneratedValue
    private Integer id;

    .......
    @OneToOne
    private CoverImage coverImage;

}

public class CoverImage
{
    @Id
    @Column(length = 1000)
    private String dataKey;
}

我一直在检查生成的 Hibernate 查询,看看是否可以通过减少数据库调用来提高性能,我很惊讶地发现

联接是 LEFT OUTER JOINS,我认为它们将是 LEFT INNER JOINS,因为 CoverArt 仅作为歌曲的一部分存在。 CoverImage 确实独立存在,因为它存储大量图像数据,因此希望在歌曲之间共享,但是当我检索一首歌曲时,我只对通过 CoverArt 链接的 CoverImage 感兴趣。

我可以做一些调整来改善这一点吗?

 ....
 from Song this_ 
 left outer join Song_CoverArt coverarts2_ on this_.recNo=coverarts2_.Song_recNo 
 left outer join CoverArt coverart3_ on coverarts2_.coverArts_id=coverart3_.id
 left outer join CoverImage coverimage4_ on coverart3_.coverImage_dataKey=coverimage4_.dataKey 
 where this_.recNo in (?)

【问题讨论】:

    标签: hibernate jpa orm jpa-2.0


    【解决方案1】:

    如果您使用内部连接,那么您将自动仅获取具有非空 Song_CoverArt、CoverArt 和 CoverImage 的歌曲。如果其中任何一个不存在,则不会返回整个条目。通过使用外部连接,您可以获得所有请求的歌曲,并且缺少的值为 null。

    【讨论】:

    • 不,如果我使用 LEFT INNER JOINS 则不会
    • 实际上我可能会感到困惑,因为当我查看自己的 SQL 时,它只是说“左连接”而不是“左内”或“左外”。如果 HIbernate 确实返回了一首带有 CoverArt 但没有 CoverImage 的歌曲,我会进行跟进,这会给我带来问题,我可以防止这种情况发生以使最终加入常规 INNER JOIN 吗?
    • LEFT OUTER JOIN 中的 OUTER 是可选的stackoverflow.com/questions/6625964/…
    • 至于在休眠中强制内部连接,stackoverflow 上有几个关于该问题的答案,我不确定哪个最适合您的情况。所以搜索“hibernate inner join”,希望其中一个会点击。
    猜你喜欢
    • 2012-02-18
    • 2011-06-20
    • 2011-06-06
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    • 2018-06-03
    相关资源
    最近更新 更多