sql >> データベース >  >> RDS >> Mysql

hibernateを使用したスト​​アドプロシージャを介して複数のテーブルエンティティを取得できません

    Hibernateドキュメントの「ストアドプロシージャを使用するためのルール/制限」には、

    "プロシージャは結果セットを返す必要があります。これらのサーバーは複数の結果セットと更新カウントを返す可能性があるため、Hibernateは結果を繰り返し、結果セットである最初の結果を戻り値として受け取ります。それ以外はすべて破棄されました。」 (参照: http://docs。 jboss.org/hibernate/orm/3.3/reference/en/html/querysql.html#sp_query

    述べたように、あなたのケースの2番目の結果セットは無視されています。

    両方の結果セットを取得するには、jdbcを使用する必要があります。そうするために別々のクラスを作成することも、hibernateがセッションの「doWork」メソッドと「doReturningWork」メソッドを介して従来のjdbc操作を実行するためのメソッドを提供することもできます...

    簡単な例は次のとおりです。

    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. データベース内の各テーブルのレコード数を一覧表示するクエリ

    2. ドメインの代わりにローカルホストでMySQLを接続/使用する方が速いですか(ドメインが同じコンピューターに解決される場合でも)?

    3. MySQLの主キー:UUID / GUIDとBIGINT(タイムスタンプ+ランダム)

    4. sqlparameterをIN()に渡す方法は?