为什么Hibernate使用OUTER连接



我正在使用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;
}

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

连接是左外部连接,我假设它们是左内部连接,因为封面艺术仅作为歌曲的一部分存在。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 (?)

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

最新更新