0

遅延読み込みを実現する方法を見つけることができませんでした (MyBatis ドキュメントでも)。

私のマッパーxmlを以下に示します:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.example.FooMyBatisLazyFetch">
        <select id="callFooProc"
                parameterType="com.example.FooProcBundle"
                statementType="CALLABLE">
            {call FooProc(
                    #{arg1,  jdbcType=VARCHAR, mode=IN},
                    #{arg2,  jdbcType=VARCHAR, mode=IN},
                    #{arg3,  jdbcType=VARCHAR, mode=IN},
                    #{error, jdbcType=NUMERIC, mode=OUT},
                    #{res2,  jdbcType=CURSOR,  mode=OUT, resultMap=FooProcResult}
                )
            }
        </select>

        <resultMap id="FooProcResult" type="com.example.FooProcResult">
            <result property="bar1" column="barcol1"/>
            <result property="bar2" column="barcol2"/>
            <result property="bar3" column="barcol3"/>
            <result property="bar4" column="barcol4"/>
            <result property="bar5" column="barcol5"/>
        </resultMap>
    </mapper>

ポジョクラス:

    public class FooProcResult {
        private String bar1;
        private String bar2;
        private String bar3;
        private String bar4;
        private String bar5;
    }        

    public class FooProcBoondle {
        private String arg1;
        private String arg2;
        private String arg3;
        private Integer error;
        private List<FooProcResult> res2;
        //getters,setters, etc
    }

そして使用法コード;

    FooProcBundle bundle = new FooProcBundle();
    bundle.setArg1("foo");
    bundle.setArg2("bar");
    bundle.setArg3("baz");
    fooMyBatisLazyFetch.callFooProc(bundle);
    Integer error = bundle.getError();
    if(error == 123) /*some condition*/ {
        List<FooProcResult> res2 = bundle.getRes2();
        // iterate res2
    --->// Only here CURSOR may be opened and executed
    }

つまり、コードで明示的に要求しない限り、res2 を取得したくありません。その特定のカーソルは非常に重いので、必要でないときは実行したくありません (しかし、mybatis は実行します)。

また、これをジェネレーターのようなプロシージャーに適用したいと思います (Oracle はそれらを「パイプライン化されたテーブル関数」と呼び、結果を生成し、スリープし、呼び出し元が次の行をフェッチするまで待機し、ウェイクアップして次を計算します。通常、この方法で呼び出します: SELECT * FROM TABLE(GenProc(arg1,arg2)).

これを達成するために必要な構成についてのアイデアはありますか?

4

1 に答える 1

0

プロシージャの出力カーソル パラメータは、クラスorg.apache.ibatis.executor.resultset.DefaultResultSetHandler でメソッドhandleOutputParametersで処理され、次にメソッドhandleRefCursorOutputParameterで処理されます。現在の状態のコードではシークが許可されていないことに注意してください。使用される唯一の「カスタムオプション」は、提供する必要があるresultMapです。また、遅延読み込み、カスタム結果ハンドラー、実際の実行時間とフェッチ時間を監視できるログなど、いくつかのオプションがあればさらにありがたいです。

これは JDBC で実現でき、フレームワークに実装されていない構成が必要になります。

于 2016-12-06T21:31:43.300 に答える