关系描述
User实体和Group实体是多对多的关系,实体和表的对应关系如下:
Java Bean
表
User
tb_user
Group
tb_group
tb_user表的字为:ID,UserName,FirstName,LastName
tb_group表的字段为:ID,Name
其中关联关系中间表为:tb_userGroup,其字段为:ID,UserID(外键,引用tb_user表的id),GroupID(外键,引用tb_group表的id)
User实体的代码如下:
public class User{
private Long id;
private String userName;
private String firstName;
private String lastName;
private Set groupList = new HashSet();
// Constructors
/** default constructor */
public User() {
}
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
public String getUserName() {
return this.userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getFirstName() {
return this.firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return this.lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getUsername() {
return this.userName;
}
public Set getGroupList() {
return groupList;
}
public void setGroupList(Set groupList) {
this.groupList = groupList;
}
}
Group实体代码如下:
public class Group implements java.io.Serializable {
private Long id;
private String name;
private Set userList = new HashSet();
// Constructors
/** default constructor */
public Group() {
}
public String getName() {
return this.name;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public Set getUserList() {
return userList;
}
public void setUserList(Set userList) {
this.userList = userList;
}
}
User实体的映射文件如下:
hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
Group实体的映射文件如下:
hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
那么查询在某个Group的User集合的QBC写法为:
public Set getUnBelongUserList(Long groupId) {
DetachedCriteria userCriteria = DetachedCriteria
.forClass(TmsUser.class);
userCriteria.createAlias("groupList", "groupList", Criteria.LEFT_JOIN);
Property tempGroupId = Property.forName("groupList.id");
userCriteria.add(tempGroupId.eq(groupId));
return this.getHibernateTemplate().findByCriteria(userCriteria);
}
说明:
lcreateAlias方法不光能为实体属性取别名,他同时也会立即加载该属性,相当于setFetchMode方法。这样写后Hibernate会关联去关联tb_userGroup和tb_group表
l用面向对象的思想,通过User实体下的Group集合groupList.id来匹配查询条件,这样写后,Hibernate会判断groupList集合中,哪一个group的id等于参数groupId
生成的Sql语句大概为:
select
*
from
tb_user this_
left outer join
tb_userGroup grouplist3_
on this_.ID=grouplist3_.UserID
left outer join
tb_group grouplist1_
on grouplist3_.GroupID=grouplist1_.ID
wheregrouplist1_.ID=?