Подтвердить что ты не робот

Невозможно получить несколько объектов таблицы через Хранимую процедуру, используя спящий режим

Вот моя хранимая процедура

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

P.S строка enum_master с id 1 находится в DB

Спасибо.

4b9b3361

Ответ 1

"Правила/ограничения использования хранимых процедур" в документации на спящий режим указывают, что

"Процедура должна возвращать набор результатов. Обратите внимание: поскольку эти серверы могут возвращать несколько наборов результатов и количество обновлений, Hibernate будет выполнять итерацию результатов и перенести первый результат, который является результирующим набором в качестве возвращаемого значения. отбрасывается". (ссылка: http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querysql.html#sp_query)

Как указано, второй результат в вашем случае игнорируется.

Вам нужно будет использовать jdbc для получения обоих наборов результатов. Либо вы можете сделать отдельные классы для этого, либо, наоборот, hibernate предлагает вам методы для выполнения традиционных операций jdbc через его методы "doWork" и "doReturningWork" в сеансе...

Простым примером может быть:

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 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
            }
        });