为什么 Hibernate 使用 OUTER 连接
Why is Hibernate using OUTER joins
我正在使用 Hibernate 4.3。11.Final 和 H2(基于磁盘)数据库[=12=]
Key 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 链接的 CoverImages 感兴趣。
我可以做一些调整来改善这个吗?
....
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、CoverArt 和 CoverImage 的歌曲。如果其中任何一个不存在,则不会返回整个条目。通过使用外连接,您可以获得所有请求的歌曲,并且缺失值为空。
我正在使用 Hibernate 4.3。11.Final 和 H2(基于磁盘)数据库[=12=]
Key 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 链接的 CoverImages 感兴趣。
我可以做一些调整来改善这个吗?
....
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、CoverArt 和 CoverImage 的歌曲。如果其中任何一个不存在,则不会返回整个条目。通过使用外连接,您可以获得所有请求的歌曲,并且缺失值为空。