Mysql
 sql >> база данни >  >> RDS >> Mysql

Не може да се получат множество обекти на таблица чрез Съхранена процедура с помощта на хибернация

„Правила/ограничения за използване на съхранени процедури“ в документацията за хибернация гласи, че

"Процедурата трябва да върне набор от резултати. Имайте предвид, че тъй като тези сървъри могат да връщат множество набори от резултати и броя на актуализациите, Hibernate ще повтори резултатите и ще приеме първия резултат, който е набор от резултати, като своя върната стойност. Всичко останало ще бъде изхвърлен." (справка:http://docs. jboss.org/hibernate/orm/3.3/reference/en/html/querysql.html#sp_query )

Както беше посочено, вторият набор от резултати във вашия случай се игнорира.

Ще трябва да използвате jdbc за получаване на двата резултата. Или можете да направите отделни класове за това, или алтернативно, hibernate ви предлага методи за извършване на традиционни jdbc операции чрез методите 'doWork' и 'doReturningWork' на своята сесия...

Един прост пример може да бъде:

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. Изпратете няколко елемента <select> с jQuery POST

  2. Предайте параметър на командния ред на MySQL скрипт

  3. Вмъкване на масив в MySQL база данни с PHP

  4. Отпечатайте действителната заявка, която MySQLdb изпълнява?

  5. Как да внедря система за маркиране, подобна на SO в php/mysql?