2016-05-23 3 views
0

Я не мог найти, как достичь ленивой загрузки (даже в документах 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)).

Любые идеи о конфигурации, необходимых для достижения этой цели?

+0

ленивая загрузка для процедуры? у вас есть решение сейчас? – frank

ответ

0

Процедура параметры вывода курсора обрабатываются в классе org.apache.ibatis.executor.resultset.DefaultResultSetHandler в методе handleOutputParameters, а затем в методе handleRefCursorOutputParameter , Вы заметите, что код в его текущем состоянии не позволяет делать то, что вы ищете, единственным используемым «настраиваемым вариантом» является resultMap, который должен быть предоставлен. Я также оценил бы еще несколько вариантов, таких как ленивая загрузка, пользовательский обработчик результатов и некоторые журналы, чтобы иметь возможность контролировать фактическое время выполнения и время выборки.

Это может быть достигнуто в JDBC и потребует конфигурации, которая не реализована в рамках.