http://hi.baidu.com/jivam/item/7b8342639bd104167cdeccf7
以前查询SQL的时候,总是用createSQLQuery ,但是createSQLQuery有点问题 ,有些 native sql (正确的)通过这个方法,有时候Hibernate会关联对象报错,因此还是找JDBC的方式安全一些。
但是Hibernate 的 HibernateDaoSupport 中 getSession().connection() 已经过期
网上找到的代替方法可以使用SessionFactoryUtils.getDataSource(getSessionFactory()).getConnection()
SessionFactoryUtils - org.springframework.orm.hibernate3.SessionFactoryUtils
得到 java.sql.Connection 就好说了,但是记住要关闭连接,否则多次调用会超出连接数死掉。
顺带提供一个JDBC的查询方法
public List<Object[]> loadAllAsSql(String sql) {
List<Object[]> ret = new ArrayList<Object[]>();
java.sql.Connection c = null;
java.sql.PreparedStatement ps = null;
java.sql.ResultSet rs = null;
try {
c = SessionFactoryUtils.getDataSource(getSessionFactory()).getConnection();
ps = c.prepareStatement(sql);
rs = ps.executeQuery();
while(rs.next()) {
int length = rs.getMetaData().getColumnCount();
Object ro[] = new Object[length];
for (int i = 0; i < ro.length; i++) {
ro[i] = rs.getObject(i+1);
}
ret.add(ro);
}
} catch (Exception e) {
log.debug("Failed executing sql query:"+sql);
log.error("Error Message:"+e.getMessage());
} finally {
try{ rs.close();}catch(Exception e){}
try{ ps.close();}catch(Exception e){}
try{ c.close();}catch(Exception e){}
}
return ret;
}