10

これが私のストアドプロシージャです

Create PROCEDURE  [dbo].getUserAndEnum

AS

BEGIN

select * from user_master where id =1

select * from enum_master where id = 1

End

休止状態で私が書いた

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

Transaction tr = session.beginTransaction();

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

List list = qr.list();

リストでは、ユーザーオブジェクトのみを取得しています..ID 1のenum_master行はどうですか

ID 1 の PS enum_master 行が DB にあります

ありがとう。

4

1 に答える 1

5

休止状態のドキュメントの「ストアドプロシージャを使用するためのルール/制限」には、

「プロシージャは結果セットを返す必要があります。これらのサーバーは複数の結果セットと更新カウントを返すことができるため、Hibernate は結果を反復し、結果セットである最初の結果を戻り値として取得することに注意してください。それ以外はすべて破棄されます。」 (参照: http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querysql.html#sp_query )

述べたように、あなたの場合の2番目の結果セットは無視されています。

両方の結果セットを取得するには、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
            }
        });
于 2013-02-13T12:05:46.303 に答える