Mysql
 sql >> Base de données >  >> RDS >> Mysql

Impossible d'obtenir plusieurs entités Table via la procédure stockée à l'aide de la mise en veille prolongée

'Règles/limitations pour l'utilisation des procédures stockées' dans la documentation d'hibernation indique que

"La procédure doit renvoyer un ensemble de résultats. Notez que puisque ces serveurs peuvent renvoyer plusieurs ensembles de résultats et mettre à jour les compteurs, Hibernate itérera les résultats et prendra le premier résultat qui est un ensemble de résultats comme valeur de retour. Tout le reste sera rejeté." (référence :http://docs. jboss.org/hibernate/orm/3.3/reference/en/html/querysql.html#sp_query )

Comme indiqué, le deuxième ensemble de résultats dans votre cas est ignoré.

Vous devrez utiliser jdbc pour obtenir les deux ensembles de résultats. Soit vous pouvez créer des classes séparées pour le faire, soit hibernate vous propose des méthodes pour effectuer des opérations jdbc traditionnelles via les méthodes 'doWork' et 'doReturningWork' de sa session...

Un exemple simple pourrait être :

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