Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Não é possível obter várias entidades de tabela por meio do procedimento armazenado usando a hibernação


'Regras/limitações para usar procedimentos armazenados' na documentação de hibernação afirma que

"O procedimento deve retornar um conjunto de resultados. Observe que como esses servidores podem retornar vários conjuntos de resultados e contagens de atualização, o Hibernate irá iterar os resultados e pegar o primeiro resultado que é um conjunto de resultados como seu valor de retorno. Todo o resto será descartado." (referência:http://docs. jboss.org/hibernate/orm/3.3/reference/en/html/querysql.html#sp_query )

Conforme declarado, o segundo conjunto de resultados no seu caso está sendo ignorado.

Você precisaria usar jdbc para obter os dois conjuntos de resultados. Ou você pode criar classes separadas para fazer isso ou, alternativamente, o hibernate oferece métodos para executar operações jdbc tradicionais por meio dos métodos 'doWork' e 'doReturningWork' de sua sessão ...

Um exemplo simples poderia 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
            }
        });