Hibernate执行原生态SQL语句通用方法
最近在给系统(原系统是Hibernate做的持久层)加一些统计方面的功能,一般用Hihbernate都是用DAO类继承org.springframework.orm.hibernate.support.HibernateDaoSupport类的getHibernateTemplate()方法来获取链接执行HQL语句。可是有时(如做一些统计功能时)一些比较复杂的SQL在转换成HQL比较麻烦时就希望Hibernate能直接SQL(不想在系统外再去加一个JDBC拉链)。
注:对参数cls(VO对象)的要求:cls对象的setter方法名get后的字母全大写(如:setMAXACCEPTDATE)
/**
* @author crsystem
* @param sql SQL语句
* @param cls 查询结果集(ResultSet)转换成ArrayList时要用到的VO对象(如:GatherNodeVO.class)
* @return ResultSet
* 通过Hibernate 执行原生态的SQL语句通用方法
* 对参数cls(VO对象)的要求:cls对象的setter方法名get后的字母全大写(如:setMAXACCEPTDATE)
*/
@SuppressWarnings("unchecked")
public List getListBysql(String sql,Class cls){
List list=new ArrayList();
Connection conn=null;
Statement stm=null;
ResultSet rs=null;
try {
conn=this.getHibernateTemplate().getSessionFactory().openSession().connection();
stm = conn.createStatement();
rs=stm.executeQuery(sql);
ResultSetMetaData rsmd = rs.getMetaData(); //取得数据表中的字段数目,类型等返回结果
//是以ResultSetMetaData对象保存
int columnCount = rsmd.getColumnCount(); //列的总数
while(rs.next()){
Object obj=Class.forName(cls.getName()).newInstance();//类的实例化
for (int i = 1; i <= columnCount; i++) {
//取得ActionForm或VO中的set方法
String colName=rsmd.getColumnName(i); //获取字段名 (全大写)
//System.out.println("AAA "+colName);
colName=colName.replace(colName.charAt(0)+"", new String(colName.charAt(0)+"").toUpperCase()); //将字段名字母全大写
String methodName="set"+colName; //拼出setter方法名
//System.out.println("bbb "+methodName);
Object value=rs.getObject(i);//获取字段值
//获得Model类的set方法,获取字段的类型设置为set方法的参数类型
Method method=obj.getClass().getMethod(methodName, value.getClass());
//调用set方法,将获取到的字段值设置到obj对象中
method.invoke(obj, value);
}
list.add(obj);
}
} catch (HibernateException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}finally{
try {
// if(null != rs){
// rs.close();
// }
if(null != stm){
stm.close();
}
if(null != conn){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
return list;
}
参考: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
我的第一篇博客,记录一下学习过程。
分享到:
相关推荐
hibernate执行原生sql语句
NULL 博文链接:https://ynp.iteye.com/blog/2007053
hibernate中使用sql 而不是hql语句
Hibernate在Myeclipse下SQL语句演示,包含有HQL and Criteria语句的编写测试。
让hibernate输出sql语句参数配置.doc
模仿Hibernate生产SQL语句,使用Java反射
虽然在hibernate中有show_sql选项,但是显示出来的语句大多类似 select * from xxx where value=? 但是有时候我们需要得到完整的SQL语句,怎么办呢?使用P6SPY就可以完成这个任务
该方式是原生SQL查询的一种方式,需要个人自己书写SQL语句进行操作,用法比较灵活多变,适合比较复杂的SQL查询.该压缩包是本人对该查询方式的一种总结练习
使用Hibernate编写通用数据库操作代码
hibernate实现动态SQL查询,通过XML配置SQL,FREEMARKER 解析,生成要执行的SQL
hibernate执行sql文件中的sql并返回相应结果类似Mybatis功能
spring_Framework+经典SQL语句大全+Hibernate中文API
hibernate将本地SQL查询结果封装成对象。如进行复杂的统计等本地sql语句查询后,直接放到对象里了,而不会再使用Object进行强转
上传的资料都是非常经典的,这也是我学习过程中的心得,希望大家能给我指点,也希望大家多上传资料共同学习。千万不要传空文件夹。。。
集成spring,hibernate,并且自写了一个sql的解析器,只有controller和service层,非常方便
主要介绍了在Java的Hibernate框架中使用SQL语句的方法,Hibernate是Java的SSH三大web开发框架之一,需要的朋友可以参考下
Hibernate对原生SQL查询的支持和控制是通过SQLQuery接口实现的。通过Session接口,我们能够很方便的创建一个SQLQuery(SQLQuery是一个接口,在Hibernate4.2.2之前,默认返回的是SQLQuery的实现类——SQLQueryImpl对象...
Hibernate 函数 ,子查询 和原生SQL查询。Hibernate 函数 ,子查询 和原生SQL查询
这是一个java代码包,里面提供了一个核心类,专门负责生成 hibernate查询语句(常用的,并非所有,现在能力有限),其他都是一些辅助类,自我感觉还可以。主要是为了减轻以后的项目开发负担,可以省去拼接hql查询语句的...
使用本地sql语句查询后,无需再使用Object对查询结果进行强制转换,而是直接将查询结果放到实体Bean里了。 PS: 其实只有一版,这里只所以叫最终版是因为该附件我上传了好几天传不上去,到最后报告说‘资源已经存在...