hibernate中的query 如何能象jdbc中的resultset一样使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hibernate中的query 如何能象jdbc中的resultset一样使用相关的知识,希望对你有一定的参考价值。

就是现在考虑到代码重用,想到原来jdbc中的resultset可以根据参数索引进行查询,而现在的query直接回保存为list,不同的表无法重用。
例如:
在jdbc:
while(rs.next())
for(int i=0;i<headers.length;i++)
System.out.print(rs.getObject(i+1).toString());


在hibernate中:
List<A> l = createQuery(hql, params).list();
如果A代表不同的类,要如何能像resultset中的 rs.getObject(i+1) 一样方便使用各个属性(ps:可能各实体类参数不同)。

1.首先,通过SessionFactory创建Session实例,很多框架可以直接通过上下文getSession()获取到,在Hibernate中Session类的作用就相当于jdbc的Connection.

2.其次,在Session类中可以直接调用createQuery(hql)/createSQLQuery(hql)来获取Query/SQLQuery对象,在这个对象里面可以设置相应的参数,setFirstResult,setMaxResults等等,Query接口定义如下:
https://www.hibernate.org/hib_docs/v3/api/org/hibernate/Query.html
贴一些伪代码:
List users = session.createQuery(hql).list();//查询
session.createQuery(hql).executeUpdate(); //新增,更新

3.通过ID查询对象:(同样用User举例)
User user = session.load(User.class, id);//此处的session即Hibernate的Session,Session接口定义如下:
https://www.hibernate.org/hib_docs/v3/api/org/hibernate/Session.html

4.最后,要提到的是Hibernate本身支持JDBC方式的操作,所以可以直接获取到Statement,ResultSet,方法如下:
PreparedStatement ps = session.connection().prepareStatement(sqlString);//后面操作不再罗嗦
这种方式的适用场景主要是复杂逻辑,结构的SQL语句,以及存储过程等追问

你好
我的项目是ssh整合的,发现session没有connection()这个方法。返回类型是Connection的方法只有close()以及disconnect()。有什么解决办法?还是说我哪里写错了?

参考技术A 方法一:
ResultSet rs = null;
Connection c = (Connection) this.getCurrentSession().disconnect();
try
PreparedStatement statement = (PreparedStatement) c.prepareStatement(sql);
rs = statement.executeQuery(sql);
catch (SQLException e)
// TODO Auto-generated catch block
e.printStackTrace();

return rs;
但是会报错:Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
方法二:
Session session = this.getCurrentSession();
ResultSet rs = session.doReturningWork(new ReturningWork<ResultSet>()
@Override
public ResultSet execute(java.sql.Connection connection) throws SQLException
// TODO Auto-generated method stub
PreparedStatement preparedStatement=(PreparedStatement) connection.prepareStatement(sql);
ResultSet resultset=preparedStatement.executeQuery();
return resultset;

);
但是会报错:
Exception occurred during processing request: Operation not allowed after ResultSet closed
java.sql.SQLException: Operation not allowed after ResultSet closed

以上是关于hibernate中的query 如何能象jdbc中的resultset一样使用的主要内容,如果未能解决你的问题,请参考以下文章

通过query解析hibernate中的resultTransformer

hibernate的update及JDBC数据库批量操作

hibernate的update及JDBC数据库批量操作

Hibernate 列表与 JDBC ResultSet

如何更新 Spring Data JPA @Modifying @Query 查询中的 JPA/Hibernate @Version 字段?

Hibernate的升级&&Query用法