Hibernate executeFind()

继承了HibernateDaoSupport的DAO类中,一般的增删改会直接使用HibernateTemplate所提供的方法去执行,而遇到一些复杂查询时find()就不好用了,当然也可以自己拼HQL放进去查。所以这种情况下就会用Session创建Query,查询完后手工关闭session。
可是既然已经用了Spring了,当然就得让Spring去管理了,所以就得用executeFind()了。executeFind()方法需要一个回调HibernateCallback当做参数,HibernateCallback是一个接口,所以还需要实现它的doInHibernate()方法,此方法传递一个Session对象,可以在这个方法中使用Session进行数据的处理。

public List<Plans> getPlanAll(Pager pager)
		throws Exception {
 
	List<Plans> list = this.getHibernateTemplate().executeFind(new HibernateCallback(){
 
		public Object doInHibernate(Session s)
				throws HibernateException, SQLException {
 
			Criteria cta = s.createCriteria(Plans.class);
			if(null != pager){
				cta.setMaxResults(pager.getLimit());
				cta.setFirstResult(pager.getStart());
				String dir = pager.getDir();
				String sort = pager.getSort();
				if(null != dir && !"".equals(dir)){
 
					if(dir.equals("ASC")){
 
						cta.addOrder(Order.asc(sort));
					}
					if(dir.equals("DESC")){
						cta.addOrder(Order.desc(sort));
					}
				}
			}
			return cta.list();
		}
 
 
	});
	return list;
}

需要注意的是如果doInHibernate()中要使用外部方法中的参数,则外部方法的参数必须为final。


除非另有声明,本站遵循【署名-非商业性使用-相同方式共享 3.0 共享协议】授权。

转载原创文章请注明,转载自:Neeke[http://www.ineeke.com]

本文链接: http://www.ineeke.com/archives/hibernate-executefind/

2009年12月9日 | 归档于 J2EE技术 | 7 条评论
标签: ,
  1. 2010年4月6日 14:21 | #1

    这个回调函数很实用。 n:-hd

  2. 2009年12月10日 20:58 | #3

    我的链接写错了。。。麻烦改正一下
    是javachen不是javahcen

  3. 2009年12月10日 20:58 | #5

    这种方法,我以前用过

  4. 2009年12月9日 14:58 | #6

    沙发啊,貌似站点才恢复。
    本文排版好像有问题,我ie

    • 2009年12月11日 08:50 | #7

      是啊,全国严查XX,殃及池鱼。你说的排版是代码吧?

发表评论

XHTML: 您可以使用这些标签: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">
n:-zy n:-zr n:-zan n:-xf n:-wx n:-tz n:-tt n:-ts n:-sy n:-st n:-ss n:-sk n:-qd n:-pz n:-lh n:-kun n:-ku n:-hx n:-hd n:-gt n:-gg n:-bz

NOTICE: You should type some Chinese word (like “你好”) in your comment to pass the spam-check, thanks for your patience!