sql >> Base de Datos >  >> RDS >> Mysql

No se pueden obtener varias entidades de tabla a través del procedimiento almacenado usando hibernación

'Reglas/limitaciones para el uso de procedimientos almacenados' en la documentación de hibernación establece que

"El procedimiento debe devolver un conjunto de resultados. Tenga en cuenta que dado que estos servidores pueden devolver varios conjuntos de resultados y actualizar los recuentos, Hibernate repetirá los resultados y tomará el primer resultado que sea un conjunto de resultados como su valor de retorno. Todo lo demás será desechado." (referencia:http://docs. jboss.org/hibernate/orm/3.3/reference/en/html/querysql.html#sp_query )

Como se indicó, se está ignorando el segundo conjunto de resultados en su caso.

Necesitará usar jdbc para obtener ambos conjuntos de resultados. Puede crear clases separadas para hacerlo o, alternativamente, hibernate le ofrece métodos para realizar operaciones jdbc tradicionales a través de los métodos 'doWork' y 'doReturningWork' de su sesión...

Un ejemplo simple podría ser:

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