User实体和Group实体是多对多的关系,实体和表的对应关系如下:
Java Bean |
表
|
User
|
tb_user
|
Group
|
tb_group
|
tb_user表的字为:ID,UserName,FirstName,LastName
tb_group表的字段为:ID,Name
User实体的代码如下:
public class User{
private
Long
id
;
private String userName; private String firstName; private String lastName; private Set<Group> groupList = new HashSet<Group>();
// 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<Group> getGroupList() {
return
groupList
;
}
public void setGroupList(Set<Group> groupList) { this.groupList = groupList;
}
}
|
Group实体代码如下:
|
User实体的映射文件如下:
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
<!-- Mapping file autogenerated by MyEclipse Persistence Tools -->
<
hibernate-mapping
>
<class name="com.xxx.User" table="tb_user"> <id name="id" type="java.lang.Long"> <column name="ID" /> <generator class="native" />
</id>
<property name="userName" type="java.lang.String"> <column name="UserName" length="20" not-null="true" />
</property>
<property name="firstName" type="java.lang.String"> <column name="FirstName" length="20" not-null="true" />
</property>
<property name="lastName" type="java.lang.String"> <column name="LastName" length="20" not-null="true" />
</property>
<set name="groupList" inverse="true" table="tb_userGroup">
<key>
<column name="UserID" not-null="true" />
</key>
<many-to-many class="com.xxx. Group"> <column name="GroupID" />
</many-to-many>
</set>
</class>
</
hibernate-mapping
>
|
Group实体的映射文件如下:
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
<!-- Mapping file autogenerated by MyEclipse Persistence Tools -->
<
hibernate-mapping
>
<class name="com.xxx. Group" table="tb_group"> <id name="id" type="java.lang.Long"> <column name="ID" /> <generator class="native" />
</id>
<property name="name" type="java.lang.String"> <column name="Name" length="20" />
</property>
<set name="userList" table="tb_userGroup">
<key>
<column name="GroupID" not-null="true" />
</key>
<many-to-many class="com.xxx.User"> <column name="UserID" not-null="true"/>
</many-to-many>
</set>
</class>
</
hibernate-mapping
>
|
public Set<User> 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);
}
说明:
l
createAlias
方法不光能为实体属性取别名,他同时也会立即加载该属性,相当于setFetchMode方法。这样写后Hibernate会关联去关联tb_userGroup和tb_group表
l
用面向对象的思想,通过User实体下的Group集合groupList.id来匹配查询条件,这样写后,Hibernate会判断groupList集合中,哪一个group的id等于参数groupId
|
select |
转载于:https://blog.51cto.com/wanqiufeng/622167