Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Nie można uzyskać wielu jednostek tabeli za pomocą procedury przechowywanej przy użyciu hibernacji

„Reguły/ograniczenia dotyczące korzystania z procedur składowanych” w dokumentacji hibernacji stwierdzają, że

"Procedura musi zwrócić zestaw wyników. Należy pamiętać, że ponieważ te serwery mogą zwracać wiele zestawów wyników i liczby aktualizacji, Hibernate iteruje wyniki i przyjmuje jako wartość zwracaną pierwszy wynik będący zestawem wyników. odrzucone." (odnośnik :http://docs. jboss.org/hibernate/orm/3.3/reference/en/html/querysql.html#sp_query )

Jak wspomniano, drugi zestaw wyników w twoim przypadku jest ignorowany.

Aby uzyskać oba zestawy wyników, należałoby użyć jdbc. Albo możesz utworzyć oddzielne klasy, aby to zrobić, albo alternatywnie hibernate oferuje metody wykonywania tradycyjnych operacji jdbc za pomocą metod sesji 'doWork' i 'doReturningWork'...

Prostym przykładem może być:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Modelowanie baz danych do celów międzynarodowych i wielojęzycznych

  2. 2 sposoby zwracania wierszy zawierających tylko znaki niealfanumeryczne w MySQL

  3. PHP Web Application:pytanie o najlepsze praktyki projektowania baz danych mysql

  4. Jak naprawić błąd nieprawidłowego pliku klucza MySQL, gdy nie możesz naprawić tabeli?

  5. Mysql nie może się połączyć - Odmowa dostępu (przy użyciu hasła tak)