Spring中操作Hibernate的几种方式

1、直接操作模版方式HQL:

		//通过spring的模版方式来操作Hibernate的HQL语句
		return this.getHibernateTemplate().find("from Customer"); 

2、直接操作模版方式,对象导航查询:

return this.getHibernateTemplate().get(Customer.class, id);

3、通过获取Session来进行原始Hibernate操作HQL:

	public List sessionSel()
	{
		//如果是spring管理的web程序会有当前线程绑定的session,所以一般直接获取当前线程即可
		Session session = this.getHibernateTemplate().getSessionFactory().getCurrentSession();
		//如果是JUnit测试,由于没有启动web程序所以无法绑定当前session,那么需要自己创建(仅限测试用)
		Session session = this.getHibernateTemplate().getSessionFactory().openSession();
		Query query = session.createQuery("from Customer");	
		List list = query.list();
		return list;
	}

4、通过Hibernate模版方式操作QBC(QBC是一种简化版的HQL,无需自己写SQL,但是适用场景有限,仅限于导航属性查询,无法灵活关联,了解即可,但是有一点好处就是可以跨层拼接离线查询条件来进行跨层查询条件传递)

  DetachedCriteria criteria = DetachedCriteria.forClass(Customer.class); 
  String cust_name=customer.getCust_name();
  criteria.add(Restrictions.like("cust_name", "%"+cust_name+"%"));
-----------------离线条件由web层创建传递到dao注入到session中(如果是spring管理,直接由模版处理了,直接调方法findByCriteria即可)
this.getHibernateTemplate().findByCriteria(criteria);

需要注意的就是,如果是统计查询,如count,sum等还需要设置方式
criteria.setProjection(Projections.rowCount());再调用findByCriteria,其实也就是拼接条件不变,但是返回字段改成了count(*)

由于查出字段可以任意指定改变,但是查询条件是传递过来的,可以重复利用,所以如果接下来还需要利用此条件进行其他字段查询,需要把先前的count(*)统计设置去掉
criteria.setProjection(null);
然后再调用
this.getHibernateTemplate().findByCriteria(criteria)

		 

  

  

  

  

原文地址:https://www.cnblogs.com/javabg/p/7349746.html