中的集合执行这些查询是为了加载每个提取的
我正在使用带有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.
UsrGrp
的grp
。将从UsrGrp
到Grp
的ManyToOne标记为懒惰,这些查询应该会消失。或者,如果你想在同一个查询中加载组,你可以在查询中添加一个左联接提取:
SELECT DISTINCT usr FROM Usr usr
LEFT JOIN FETCH usr.usrGrpList userGroup
LEFT JOIN FETCH userGroup.grp grp
您还可以启用批处理获取以减少查询数量。
附言:元音很酷。UserGroup比UsrGrp 可读性更强