Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Es können nicht mehrere Tabellenentitäten über eine gespeicherte Prozedur mit Ruhezustand abgerufen werden

„Regeln/Einschränkungen für die Verwendung gespeicherter Prozeduren“ in der Hibernate-Dokumentation besagt, dass

"Die Prozedur muss eine Ergebnismenge zurückgeben. Beachten Sie, dass Hibernate, da diese Server mehrere Ergebnismengen zurückgeben und die Anzahl aktualisieren können, die Ergebnisse iteriert und das erste Ergebnis, das eine Ergebnismenge ist, als Rückgabewert nimmt. Alles andere wird es sein verworfen." (Referenz:http://docs. jboss.org/hibernate/orm/3.3/reference/en/html/querysql.html#sp_query )

Wie bereits erwähnt, wird die zweite Ergebnismenge in Ihrem Fall ignoriert.

Sie müssten jdbc verwenden, um beide Resultsets zu erhalten. Entweder können Sie dafür separate Klassen erstellen, oder alternativ bietet Hibernate Ihnen Methoden zum Ausführen traditioneller jdbc-Operationen über die Methoden 'doWork' und 'doReturningWork' seiner Sitzung...

Ein einfaches Beispiel könnte sein:

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