Я не мог найти, как достичь ленивой загрузки (даже в документах MyBatis).Lazy fetching in 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>
Pojo Класс:
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))
.
Любые идеи о конфигурации, необходимых для достижения этой цели?
ленивая загрузка для процедуры? у вас есть решение сейчас? – frank