Hibernate QBC查询时应用DetachedCriteria类进行嵌套条件子查询

当使用QBC查询时,为查询对象内的单一对象字段添加查询条件相对比较简单,但很多情况下还需要应用到sql语句的条件子查询,例如

select * from class where id in (select classId from student where name in('张三','李四'));

班级作为查询主体,只查询班级里面有叫做张三、李四这2个学生的班级,就需要用到条件子查询。

QBC查询代码简例如下:

//创建QBC查询主体,我们要查的是班级,那么映射的就是ClassModel班级模型
Criteria criteria = this.getSession().createCriteria(ClassModel.class);

//创建StudentModel学生的离线对象
DetachedCriteria studentCriteria = 
	//参数一为子查询的对象类,参数二为别名
	DetachedCriteria.forClass(StudentModel.class, "student")
	//为学生添加查询条件...
	.add(Restrictions.in("student.name",new String[]{"张三","李四"}))
	//声明学生的哪个字段为班级的联系字段,**classId非SQL字段名,是实体类的字段名**
	.setProjection(Property.forName("student.classId"));
//将学生查询对象添加到主体对象的查询条件中,表示主体对象的id要在子表查询的范围内
criteria.add(Property.forName("id").in(studentCriteria ));
//查询出班级列表
criteria.list();

这是最简单的QBC条件子查询,DetachedCriteria 类可以创建多个,层层嵌套,例如学生参加了各种组织Organization,我们要查询参加了计算机、羽毛球、学生会任意一个社团的学生所在的班级:

Criteria criteria = this.getSession().createCriteria(ClassModel.class);

DetachedCriteria orgCriteria = 
	DetachedCriteria.forClass(Organization.class, "org")
	.add(Restrictions.in("org.name",new String[]{"计算机","羽毛球","学生会"}))
	.setProjection(Property.forName("org.studentId"));

DetachedCriteria studentCriteria = 
 	DetachedCriteria.forClass(StudentModel.class, "student")
 	//.add(Restrictions.in("student.name",new String[]{"张三","李四"}))	
	.setProjection(Property.forName("student.classId"))
	//相对上一个例子,这里多了一步添加社团查询条件的步骤
	.add(Property.forName("student.id")in(orgCriteria ));

criteria.add(Property.forName("id").in(studentCriteria ));
criteria.list();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值