`

hibernate 子查询,使用离线Criteria对象实现

 
阅读更多

最近做项目,有多个表关联查询。

sql语句

 sql=" select * from s_weektask wt where wt.week_id in(select
 w.week_id from s_week w inner join s_month m on m.month_id =
 w.month_id and w.month_id= 8 ) and wt.by_assessman_id=2;";

hibernate代码

DetachedCriteria monthDetachedCriteria = DetachedCriteria.forClass(SMonth.class, "m")
				.setProjection(Property.forName("monthId"))
				.add(Restrictions.eqProperty("w.SMonth.monthId", "m.monthId"));
		
		Criteria weekCriteria = super.getSession()
		.createCriteria(SWeek.class, "w");
		weekCriteria.add(Restrictions.eq("w.SMonth.monthId", monthId));
		weekCriteria.add(Property.forName("w.SMonth.monthId").in(monthDetachedCriteria));
		List<SWeek> weekList = weekCriteria.list();
		
		Criteria weektaskCriteria = super.getSession()
		.createCriteria(SWeektask.class, "wt");
		weektaskCriteria.add(Restrictions.eq("wt.byAssessmanId", userId));
		weektaskCriteria.add(Property.forName("wt.SWeek").in(weekList));
		List<SWeektask> weektaskList = weektaskCriteria.list();

时间段查询,加模糊查询

@SuppressWarnings("unchecked")
	public List<SMonthTaskrecord> queryMonthTaskrecordList(String startDate,
			String endDate, String keyStr) throws Exception {
		
		SimpleDateFormat df = new SimpleDateFormat("yyyy年MM月");
		Date sd = df.parse(startDate);
		Date ed = df.parse(endDate);
		Criteria userCriteria = super.getSession().createCriteria(SUser.class,
				"u");
		userCriteria.add(Restrictions.like("u.userName", "%" + keyStr + "%"));
		List<SUser> userList = userCriteria.list();
		List<Integer> uidList = new ArrayList<Integer>();
		for (int i = 0; i < userList.size(); i++) {
			uidList.add(userList.get(i).getUserId());
		}

		Criteria monthTaskrecordCriteria = super.getSession().createCriteria(
				SMonthTaskrecord.class, "mt");
		
		if (sd != null) { // 查询制定时间之后的记录
			monthTaskrecordCriteria.add(Restrictions.ge("createTime", sd));
		}
		if (ed != null) { // 查询指定时间之前的记录
			monthTaskrecordCriteria.add(Restrictions.le("createTime", ed));
		}
		if (uidList.size()>0) {
			monthTaskrecordCriteria.add(Property.forName("mt.byAssessmanId").in(
					uidList));
		}else {
			monthTaskrecordCriteria.add(Property.forName("mt.byAssessmanId").eq(0));
		}
		

		List<SMonthTaskrecord> monthTaskrecord = monthTaskrecordCriteria.list();
		return monthTaskrecord;
	}

 

 ****************************另外的举例*************************************

/**
	 * 离线Criteria
	 */
	@SuppressWarnings("unchecked")
	public static void two() {
		// 没有session也可以创建DetachedCriteria
		DetachedCriteria c1 = DetachedCriteria.forClass(Employee.class);
		// 用离线的Criteria处理子查询
		DetachedCriteria c2 = DetachedCriteria.forClass(Employee.class);
		c2.setProjection(Property.forName("salary").avg()); // 添加属性的平均值投影
		DetachedCriteria c3 = DetachedCriteria.forClass(Employee.class);
		c3.setProjection(Projections.distinct(Property.forName("dept.deptId"))); // 统计部门不重复数据

		Session session = HibernateUtil.getUtil().getSession();
		Transaction tran = session.beginTransaction();
		System.out.println("++++++++++++++++++++++++++++++++++++++++");
		try {
			List<Employee> emplist = c1.getExecutableCriteria(session).list();
			for (Employee employee : emplist) {
				System.out.println(employee);
			}
			System.out.println("++++++++++++++++++++++++++++++++++++++++");
			Criteria criteria = session.createCriteria(Employee.class).add(
					Property.forName("salary").lt(c2));
			emplist = criteria.list();
			for (Employee employee : emplist) {
				System.out.println(employee);
			}
			System.out.println("++++++++++++++++++++++++++++++++++++++++");
			criteria = session.createCriteria(Dept.class).add(
					Property.forName("deptId").notIn(c3));
			List<Dept> deptlist = criteria.list();
			for (Dept dept : deptlist) {
				System.out.println(dept);
			}
			System.out.println("++++++++++++++++++++++++++++++++++++++++");
			tran.commit();
		} catch (Exception e) {
			tran.rollback();
			e.printStackTrace();
		}
	}

 

0
0
分享到:
评论

相关推荐

    hibernate02:session对象、hql查询、在线查询也叫对象查询、离线查询

    在Hibernate中,离线查询可以通过`Criteria` API或者`List`、`Query`对象的缓存结果实现。 在提供的链接中,博主可能详细探讨了这些概念,并给出了具体的代码示例。遗憾的是,由于没有具体的内容,我们无法深入分析...

    Hibernate中Criteria的使用

    Hibernate 中 Criteria 的使用 Hibernate 中 Criteria 的使用是 ...Hibernate 中 Criteria 的使用可以灵活地根据查询条件的组装来进行查询,使用 Criterion 和 Projection 设置查询条件,可以实现复杂的查询操作。

    hibernate里面的 两种查询

    Hibernate提供了两种主要的查询方式:离线查询(Criteria API)和HQL(Hibernate Query Language)语句查询。这两种查询方法各有特点,适用于不同的场景,使得开发者可以根据实际需求灵活选择。 1. Hibernate ...

    Hibernate Criteria用法大全.docx

    子查询则可以通过`Subqueries`来实现。 总的来说,Hibernate Criteria API 提供了强大的查询功能,允许开发者以面向对象的方式构建复杂查询,同时保持代码的清晰和简洁。结合其分页、排序、预测、聚合等功能,可以...

    Hibernate的Criteria用法

    4. **离线Criteria(DetachedCriteria)**: Hibernate 3引入了`DetachedCriteria`,它允许你在不直接涉及Session的情况下构建查询条件。这有助于分离业务逻辑和数据访问层,使代码更易管理。创建DetachedCriteria...

    Hibernate QBC高级查询.rar

    1. **Criteria API**:它是Hibernate提供的一个API,允许开发者使用Java对象来构建查询。相比HQL,Criteria API更具有面向对象的特点,可以动态地构建查询条件,适应复杂的需求。 2. **DetachedCriteria**:这是一...

    hibernate学习资料大合集

    它可能包含Hibernate如何通过ORM实现对象与数据库表的映射,以及如何进行CRUD(创建、读取、更新、删除)操作等内容,对于初学者来说是一份不错的入门资料。 **3. HQL.doc** HQL(Hibernate Query Language)是...

    hibernate-api

    9. **Criteria API增强**:包括DetachedCriteria,用于构建离线查询,以及Projections和CriteriaSubqueries,用于复杂的查询和子查询操作。 10. **Hibernate Types**:Hibernate支持多种数据类型映射,包括基本类型...

    hibernate3 chm 格式 中文

    7. **HQL(Hibernate Query Language)**:讲解类似于SQL的Hibernate专用查询语言,包括基本查询、聚合函数、子查询等。 8. **Criteria与HQL的比较**:对比两者在查询性能和灵活性上的优缺点。 9. **关联映射**:...

    hibernate3源码

    11. **Criteria API的高级特性**:包括DetachedCriteria用于离线查询,Projections用于聚合函数,Criteria与子查询的结合等。 12. **Callback事件**:Hibernate支持在对象生命周期中的某些关键点触发回调方法,如...

    Hibernate3.2官方中文参考手册

    2. 避免N+1查询问题:通过批处理或子查询减少数据库访问次数。 3. 批量操作:使用Session的batch_size属性或Bulk更新操作提升效率。 九、事务管理 1. Programmatic Transaction Management:在代码中手动开启、提交...

    Hibernate3.5官方开发文档pdf + html

    8. **查询语言HQL(Hibernate Query Language)**:类似SQL的查询方式,支持更面向对象的查询,包括基本查询、聚合函数、分组、子查询、连接查询等。 9. **Criteria查询**:提供API方式的动态查询,可替代HQL,方便...

    Hibernate_API

    HQL支持更高级的查询特性,如函数、子查询、聚合等。 5. **Criteria API和Query API的比较**:两者都是用于查询的API,Criteria更易于编程,因为它使用Java对象来构建查询,而HQL则更灵活,可以处理更复杂的查询...

    Hibernate+中文文档

    15.8. 离线(detached)查询和子查询 15.9. 根据自然标识查询(Queries by natural identifier) 16. Native SQL查询 16.1. 使用SQLQuery 16.1.1. 标量查询(Scalar queries) 16.1.2. 实体查询(Entity queries) ...

    Hibernate API

    - **Cascading**: 通过`@Cascade`注解实现对象间的操作传播,例如删除父对象时自动删除子对象。 - **Fetch策略**: 控制关联对象的加载时机,有EAGER(即时加载)和LAZY(延迟加载)两种。 **8. Callback事件** - ...

    最全Hibernate 参考文档

    15.8. 离线(detached)查询和子查询 16. Native SQL查询 16.1. 创建一个基于SQL的Query 16.2. 别名和属性引用 16.3. 命名SQL查询 16.3.1. 使用return-property来明确地指定字段/别名 16.3.2. 使用存储过程来查询 16.3...

    Hibernate全新帮助(两种)

    6. **HQL和 Criteria 查询的增强**:提供更强大的查询能力,包括更复杂的子查询、函数和表达式支持。 【第二部分:两种学习资源】 1. **Hibernate_3.2.0.chm**:这可能是一个关于Hibernate 3.2.0版本的离线帮助...

    Hibernate3.2参考手册

    《Hibernate3.2参考手册》是Java开发领域中不可或缺的一份资源,专为那些使用Hibernate框架进行对象关系映射(ORM)的开发者提供详尽的指导。Hibernate是Java平台上的一个开源ORM解决方案,它简化了数据库操作,允许...

    hibernate3.2中文文档(chm格式)

    15.8. 离线(detached)查询和子查询 15.9. 根据自然标识查询(Queries by natural identifier) 16. Native SQL查询 16.1. 使用SQLQuery 16.1.1. 标量查询(Scalar queries) 16.1.2. 实体查询(Entity queries) ...

    HibernateAPI中文版.chm

    15.8. 离线(detached)查询和子查询 15.9. 根据自然标识查询(Queries by natural identifier) 16. Native SQL查询 16.1. 使用SQLQuery 16.1.1. 标量查询(Scalar queries) 16.1.2. 实体查询(Entity queries) ...

Global site tag (gtag.js) - Google Analytics