精华帖 (0) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (11)
|
|
---|---|
作者 | 正文 |
发表时间:2010-03-03
最后修改:2010-03-03
Hibernate执行原生态SQL语句通用方法最近在给系统(原系统是Hibernate做的持久层)加一些统计方面的功能,一般用Hihbernate都是用DAO类继承org.springframework.orm.hibernate.support.HibernateDaoSupport类的getHibernateTemplate()方法来获取链接执行HQL语句。可是有时(如做一些统计功能时)一些比较复杂的SQL在转换成HQL比较麻烦时就希望Hibernate能直接SQL(不想在系统外再去加一个JDBC拉链)。 注:对参数cls(VO对象)的要求:cls对象的setter方法名get后的字母全大写(如:setMAXACCEPTDATE)
参考:http://ibc.iteye.com/blog/247126 http://blog.csdn.net/alexjjf/archive/2007/02/07/1504876.aspx http://www.blogjava.net/jrkui188/archive/2007/12/23/169757.html http://lavasoft.blog.51cto.com/62575/15433 我的第一篇博客,记录一下学习过程。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-03-04
楼主标题党,这个就是原始JDBC的操作啊,跟Hibernate啥关系啊,除了通过HIbernate API获取一个connection,其他一点关系都没有啊。
你把conn=this.getHibernateTemplate().getSessionFactory().openSession().connection(); 这句换成 JDBCUtil.getConnection()后就是最早的JDBC做法了。 |
|
返回顶楼 | |
发表时间:2010-03-04
标题党,付上两种用法:
return hibernateTemplate.getSessionFactory().getCurrentSession().createSQLQuery(sql) .setFirstResult(start) .setMaxResults(size) .setResultTransformer(Transformers.aliasToBean(CommunityView.class)) .list(); return getMyHibernateTemplate().getSessionFactory().getCurrentSession().createSQLQuery(sql).addEntity("orderItem", SysOrderItem.class).list |
|
返回顶楼 | |
发表时间:2010-03-04
Hibernate里记得好像直接有执行原生sql的方法?
|
|
返回顶楼 | |
发表时间:2010-03-04
可以用下面的方法实现
/** * 通过sql语句查询出符合条件的list */ public List findListBySqlQuery(final String queryString) { return (List) getHibernateTemplate().execute(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { if(queryString==null) throw new DaoParamException("BaseDao-Check.findPageByQuery - param can not be null"); Long beforTime = System.currentTimeMillis(); Connection conn = getConnection(); Statement stmt = conn.createStatement(); logger.info(queryString); ResultSet resultSet = (ResultSet)stmt.executeQuery(queryString); List listResult = new ArrayList(); while(resultSet.next()){ ResultSetMetaData rsmd = resultSet.getMetaData(); int columnCount = rsmd.getColumnCount(); Object[] arrObj = new Object[columnCount]; for(int j=0;j<arrObj.length;j++){ arrObj[j] = resultSet.getObject(j+1); } listResult.add(arrObj); } LogExecutionTime(System.currentTimeMillis() - beforTime); return listResult; } }, true); } |
|
返回顶楼 | |
发表时间:2010-03-04
这样做不如直接使用JDBC或者iBATIS。。没任何意义。。。
|
|
返回顶楼 | |
发表时间:2010-03-05
额...有必要写的 这么复杂吗?
|
|
返回顶楼 | |
发表时间:2010-03-05
yangdefeng95802 写道 可以用下面的方法实现
/** * 通过sql语句查询出符合条件的list */ public class ApplicationDAO extends HibernateDaoSupport { public List findListBySqlQuery(final String queryString) { return (List) getHibernateTemplate().execute(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { if(queryString==null) throw new DaoParamException("BaseDao-Check.findPageByQuery - param can not be null"); Long beforTime = System.currentTimeMillis(); Connection conn = getConnection(); Statement stmt = conn.createStatement(); logger.info(queryString); ResultSet resultSet = (ResultSet)stmt.executeQuery(queryString); List listResult = new ArrayList(); while(resultSet.next()){ ResultSetMetaData rsmd = resultSet.getMetaData(); int columnCount = rsmd.getColumnCount(); Object[] arrObj = new Object[columnCount]; for(int j=0;j<arrObj.length;j++){ arrObj[j] = resultSet.getObject(j+1); } listResult.add(arrObj); } LogExecutionTime(System.currentTimeMillis() - beforTime); return listResult; } }, true); } } Connection conn = getConnection();报错,不知是怎么获取的? |
|
返回顶楼 | |
发表时间:2010-03-13
确实有点标题党,想进步的话看看这里http://lgdlgd.iteye.com/admin/blogs/473147,这也许是此问题是最好的解决方案
|
|
返回顶楼 | |
发表时间:2010-03-15
java_fxj 写道 额...有必要写的 这么复杂吗?
这样只要在原系统中加一个方法就可以完成一个或多个的统计功能(就是不想多改动原系统中一些底层DAO类),其它的一些些写法我基本上也都试过,可是在我的系统中行不通。 谢谢各位的观注和回复! |
|
返回顶楼 | |