Mysql
 sql >> Database >  >> RDS >> Mysql

Impossibile ottenere più entità tabella tramite la stored procedure utilizzando l'ibernazione

'Regole/limitazioni per l'utilizzo di stored procedure' nella documentazione di ibernazione afferma che

"La procedura deve restituire un set di risultati. Si noti che poiché questi server possono restituire più set di risultati e conteggi di aggiornamento, Hibernate itera i risultati e prende il primo risultato che è un set di risultati come valore restituito. Tutto il resto sarà scartato." (riferimento:http://docs. jboss.org/hibernate/orm/3.3/reference/en/html/querysql.html#sp_query )

Come affermato, il secondo set di risultati nel tuo caso viene ignorato.

Dovresti usare jdbc per ottenere entrambi i set di risultati. O puoi creare classi separate per farlo o, in alternativa, hibernate ti offre metodi per eseguire le tradizionali operazioni jdbc tramite i metodi 'doWork' e 'doReturningWork' della sua sessione...

Un semplice esempio potrebbe essere:

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