hibernate动态条件高级查询criteria

本文介绍如何使用Hibernate的DetachedCriteria类进行高效的条件查询。通过实例展示了如何利用Restrictions和createAlias方法构建复杂的查询条件,实现多表连接及外键关联查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们知道,我们在做项目时候,用到的最多的无非就是查询,各种条件查询.这个时候,如果我们再采用纯粹的hql语句来通过if判断的话,效率就十分低下而且会有很多判断.

那么,hibernate在3以后,推出了一个很有意义的对象DetachedCriteria,通过这个类,我们可以得到Criteira对象.然后可以利用Restrictions,Projection等,构造各种条件.

而且支持多表连接,外键关联查询,忽略大小写等.很实用.

DetachedCriteria dc = DetachedCriteria.forClass(Employee.class);
		Criteria cri = dc.getExecutableCriteria(getSession());
		cri.createAlias("department", "department");
		if (currEmp.getRole().getRoleId() == FinalVariable.SIMPLE_RID) {
			cri.add(Restrictions.eq("empId", currEmp.getEmpId()));
		} else if (currEmp.getRole().getRoleId() == FinalVariable.DEP_MANAGER_RID) {
			if (emp != null) {
				if (emp.getEmpId() != null) {
					cri.add(Restrictions.eq("empId", emp.getEmpId()));
				}
			}
			cri.add(Restrictions.eq("department.depId", currEmp.getDepartment()
					.getDepId()));
		} else {
			if (emp != null) {
				if (emp.getEmpId() != null) {
					cri.add(Restrictions.eq("empId", emp.getEmpId()));
				} else if (emp.getDepartment().getDepId() != null) {
					cri.add(Restrictions.eq("department.depId", emp
							.getDepartment().getDepId()));
				}
			}
			cri.addOrder(Order.asc("department.depId"));
		}
		return cri.list();


下面贴上,我自己写的一个小例子:

其中,员工里面有个Department引用.这个时候如果我们想用department下面的depId,我们需要使用criteria的createAlias("","");方法,首先创建一个别名,这样就可以用外键去关联查询了,发送的sql语句都是关联的查询.很方便.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值