JPA объединяет таблицу ассоциаций выборки с N select, сгенерированным Hibernate? - PullRequest
0 голосов
/ 27 июня 2011

Я использую JPA с Hibernate3 в качестве реализации.У меня есть таблица ассоциации UsrGrp

Usr.java
@Id
@Basic(optional = false)
@Column(name = "usr_id")
private String usrId;
@OneToMany(mappedBy = "usr")
private List<UsrGrp> usrGrpList;

UsrGrp.java
@EmbeddedId
protected UsrGrpPK usrGrpPK;
@Column(name = "updated_by")
private String updatedBy;
@Column(name = "updated_date")
@Temporal(TemporalType.TIMESTAMP)
private Date updatedDate;
@JoinColumn(name = "grp_id", referencedColumnName = "grp_id", insertable = false, updatable = false)
@ManyToOne(optional = false)
private Grp grp;
@JoinColumn(name = "usr_id", referencedColumnName = "usr_id", insertable = false, updatable = false)
@ManyToOne(optional = false)
private Usr usr;

Grp.java
@Id
@Basic(optional = false)
@Column(name = "grp_id")
@OneToMany(mappedBy = "grp")
private List<UsrGrp> usrGrpList;

(Usr) 1 -------- * (UsrGrp) * -------- 1 (Grp)

Когда я выполняю следующие sql.

SELECT DISTINCT usr FROM Usr usr LEFT JOIN FETCH usr.usrGrpList

Hibernate фактически выполняет то же количество запросов на выборку, что и номера Grp, которые у меня есть.

select grp0_.grp_id as grp1_6_0_ from grp grp0_ where grp0_.grp_id=?
select grp0_.grp_id as grp1_6_0_ from grp grp0_ where grp0_.grp_id=?
...

Есть ли способ избежать этого выбора N?запросы?Спасибо.

Ответы [ 2 ]

0 голосов
/ 27 июня 2011

Эти запросы выполняются для загрузки grp каждого извлеченного UsrGrp.Отметьте ManyToOne от UsrGrp до Grp как ленивый, и эти запросы должны исчезнуть.Или, если вы хотите загрузить группы в одном запросе, вы можете добавить в запрос выборку из левого соединения:

SELECT DISTINCT usr FROM Usr usr 
LEFT JOIN FETCH usr.usrGrpList userGroup 
LEFT JOIN FETCH userGroup.grp grp

Вы также можете включить пакетную выборку , чтобы уменьшить числозапросов.

PS: гласные это круто.UserGroup гораздо удобнее для чтения, чем UsrGrp

0 голосов
/ 27 июня 2011

Да. Вы можете изменить режим получения с ленивого на нетерпеливый:

Criteria crit = session.createCriteria( Usr.class )
                           .setFetchMode( "usrgrp", FetchMode.JOIN )

где usrgrp - набор в Usr.class.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...