Hibernate生成的带有N选择的JPA join fetch关联表



我正在使用带有Hibernate 3的JPA作为实现。我有一个关联表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实际上执行的select查询数量与我所拥有的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个选择查询?谢谢

是。您可以将提取模式从懒惰更改为渴望:

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

其中usrgrp是Usr.class.

中的集合执行这些查询是为了加载每个提取的UsrGrpgrp。将从UsrGrpGrp的ManyToOne标记为懒惰,这些查询应该会消失。或者,如果你想在同一个查询中加载组,你可以在查询中添加一个左联接提取:
SELECT DISTINCT usr FROM Usr usr 
LEFT JOIN FETCH usr.usrGrpList userGroup 
LEFT JOIN FETCH userGroup.grp grp

您还可以启用批处理获取以减少查询数量。

附言:元音很酷。UserGroup比UsrGrp 可读性更强

最新更新