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

Kan ikke hente flere tabelenheder gennem Lagret procedure ved brug af dvale

'Regler/begrænsninger for brug af lagrede procedurer' i dvaledokumentation angiver, at

"Proceduren skal returnere et resultatsæt. Bemærk, at da disse servere kan returnere flere resultatsæt og opdatere tællinger, vil Hibernate gentage resultaterne og tage det første resultat, der er et resultatsæt, som dets returværdi. Alt andet vil blive kasseret." (reference:http://docs. jboss.org/hibernate/orm/3.3/reference/en/html/querysql.html#sp_query )

Som nævnt bliver det andet resultatsæt i dit tilfælde ignoreret.

Du skal bruge jdbc for at få begge resultatsæt. Enten kan du lave separate klasser til at gøre det, eller alternativt tilbyder hibernate dig metoder til at udføre traditionelle jdbc-operationer via sessionens 'doWork' og 'doReturningWork'-metoder...

Et simpelt eksempel kunne være:

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



  1. Returner oplysninger om operativsystemversion i SQL Server med sys.dm_os_host_info Dynamic Management View

  2. Hvordan man konsekvent optjener en Microsoft Access MVP Award

  3. Fordele ved NoSQL-databaser – Alt hvad du behøver at vide

  4. PHP - Indsæt dato i mysql