sql >> Database >  >> RDS >> Mysql

Kan niet meerdere tabelentiteiten krijgen via de opgeslagen procedure met slaapstand

'Regels/beperkingen voor het gebruik van opgeslagen procedures' in de slaapstanddocumentatie stelt dat

"De procedure moet een resultatenset retourneren. Merk op dat aangezien deze servers meerdere resultatensets en updatetellingen kunnen retourneren, Hibernate de resultaten zal herhalen en het eerste resultaat dat een resultaatset is als retourwaarde zal nemen. Al het andere zal zijn weggegooid." (referentie:http://docs. jboss.org/hibernate/orm/3.3/reference/en/html/querysql.html#sp_query )

Zoals gezegd wordt de tweede resultatenset in jouw geval genegeerd.

U zou jdbc moeten gebruiken om beide resultatensets te krijgen. Ofwel kunt u hiervoor aparte klassen maken, of als alternatief biedt hibernate u methoden voor het uitvoeren van traditionele jdbc-bewerkingen via de 'doWork'- en 'doReturningWork'-methoden van de sessie...

Een eenvoudig voorbeeld zou kunnen zijn:

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. Hoe de tijd uit de database te ontleden

  2. MySQL:de SELECT zou meer dan MAX_JOIN_SIZE rijen onderzoeken

  3. Selecteer waarden uit het XML-veld in SQL Server 2008

  4. MySQL-syntaxisfout bij het uitvoeren van SQL-query