Sur*_*tta 10 java mysql stored-procedures hibernate
这是我的存储过程
Create PROCEDURE [dbo].getUserAndEnum
AS
BEGIN
select * from user_master where id =1
select * from enum_master where id = 1
End
Run Code Online (Sandbox Code Playgroud)
用hibernate写的
Session session = HibernateFactory.getSessionFactory().openSession();
Transaction tr = session.beginTransaction();
SQLQuery qr=session.createSQLQuery("getUserAndEnum");
List list = qr.list();
Run Code Online (Sandbox Code Playgroud)
在列表中我只获取用户对象..我的enum_master行的ID为1
数据库中存在ID为1的PS enum_master行
谢谢.
休眠文档中的“使用存储过程的规则/限制”指出
“该过程必须返回一个结果集。请注意,由于这些服务器可以返回多个结果集和更新计数,Hibernate 将迭代结果并将作为结果集的第一个结果作为其返回值。其他一切都将被丢弃。” (参考:http : //docs.jboss.org/hibernate/orm/3.3/reference/en/html/querysql.html#sp_query)
如上所述,您案例中的第二个结果集被忽略。
您需要使用 jdbc 来获取两个结果集。您可以为此创建单独的类,或者,hibernate 为您提供通过其会话的“doWork”和“doReturningWork”方法执行传统 jdbc 操作的方法......
一个简单的例子可能是:
List<Object> res = session.doReturningWork(new ReturningWork<List<Object> /*objectType returned*/>() {
@Override
/* or object type you need to return to process*/
public List<Object> execute(Connection conn) throws SQLException
{
CallableStatement cstmt = conn.prepareCall("CALL YOUR_PROCEDURE");
//Result list that would return ALL rows of ALL result sets
List<Object> result = new ArrayList<Object>();
try
{
cstmt.execute();
ResultSet rs = cstmt.getResultSet(); // First resultset
while (rs.next()) {//Read items/rows of first resultset
// .
// Process rows of first resultset
result.add(obj); // add items of resultset 1 to the returning list object
}
cstmt.getMoreResults(); // Moves to this Statement object's next result, returns true if it is a ResultSet object
rs = cstmt.getResultSet(); // Second resultset
while (rs.next()) {
// .
// Process rows of second resultset
result.add(obj); // add items of resultset 2 to the returning list object
}
rs.close();
}
finally
{cstmt.close();}
return result; // this should contain All rows or objects you need for further processing
}
});
Run Code Online (Sandbox Code Playgroud)