Почему Hibernate использует OUTER соединения - PullRequest
0 голосов
/ 03 октября 2018

Я использую 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, чтобы определить,Я могу удивиться, обнаружив, что

объединений были левыми внешними соединениями, я предполагал, что они будут левыми внутренними соединениями, поскольку CoverArt существует только как часть песни.CoverImage существует независимо, так как здесь хранятся большие данные изображения, поэтому я хочу поделиться ими с песнями, но когда я извлекаю песню, меня интересуют только CoverImages, связанные через CoverArt.

Могу ли я внести некоторые изменения, чтобы улучшить это?

 ....
 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 голосов
/ 03 октября 2018

Если вы используете внутренние объединения, вы автоматически получите только те песни, которые имеют ненулевое значение Song_CoverArt, CoverArt и CoverImage.Если какой-либо из них не существует, вся запись не будет возвращена.Используя внешние объединения, вы получаете все запрошенные песни, а недостающие значения равны нулю.

...