为什么Hibernate使用OUTER联接

时间:2018-10-03 12:36:11

标签: hibernate jpa orm jpa-2.0

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

关键的休眠类是

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查询,以查看是否可以通过减少数据库调用来提高性能,我很惊讶地发现

联接是左外联接,我认为它们将是左内联接,因为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 (?)

1 个答案:

答案 0 :(得分:1)

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