java中使用QBC的好处_使用QBC的方式应用多对多关系中的查询

关系描述

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=?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值