簡體   English   中英

無法通過使用hibernate的存儲過程獲取多個Table實體

[英]Unable to get multiple Table entities through Stored procedure using hibernate

這是我的存儲過程

Create PROCEDURE  [dbo].getUserAndEnum

AS

BEGIN

select * from user_master where id =1

select * from enum_master where id = 1

End

用hibernate寫的

Session session = HibernateFactory.getSessionFactory().openSession();

Transaction tr = session.beginTransaction();

SQLQuery qr=session.createSQLQuery("getUserAndEnum");

List list = qr.list();

在列表中我只獲取用戶對象..我的enum_master行的ID為1

數據庫中存在ID為1的PS enum_master行

謝謝。

在hibernate文檔中,“使用存儲過程的規則/限制”說明了這一點

“該過程必須返回結果集。請注意,由於這些服務器可以返回多個結果集和更新計數,因此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
            }
        });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM