Разработка картографирования INSERT для myBatis3 для заданного типа pojo - PullRequest
0 голосов
/ 23 октября 2018

Как будет выглядеть INSERT mapper в myBatis3, если у меня есть модель pojo, такая как

class DR {
 FormatType format;
}

class SQLDR extends DR{
 String sql;
}

class PDR extends DR {
 Predicate predicate;
}

class Download {
 DR request;
 String status;
 long size;
}

Я хочу вставить объект Download в таблицу, как спроектировать INSERT mapper в myBatis3, так как у меня есть загрузки как SQLDR, так иТип PDR, установленный во время выполнения, должен иметь возможность принимать значение, основанное на типе формата, и устанавливать его.

Я пробую маппер следующим образом: он не работает

<sql id="DOWNLOAD_FIELD_TYPES">
    #{key,jdbcType=VARCHAR},
    <choose>
        <when test="format = 'SQL'"> #{request.sql,jdbcType=VARCHAR},</when>
        <otherwise> #{request.predicate,jdbcType=VARCHAR}, </otherwise>
    </choose>
    #{status,jdbcType=OTHER},
    #{size,jdbcType=BIGINT},
    #{request.format,jdbcType=OTHER},
</sql>

<sql id="DOWNLOAD_FIELDS">
    key,filter,status,size,format
</sql>

 <insert id="create" parameterType="Download">
    INSERT INTO download(<include refid="DOWNLOAD_FIELDS"/>)
    VALUES(<include refid="DOWNLOAD_FIELD_TYPES"/>)
 </insert>

Причина: org.apache.ibatis.reflection.ReflectionException: для свойства с именем 'sql' в 'классе DR' нет метода извлечения

1 Ответ

0 голосов
/ 23 октября 2018

В этом случае самым простым методом было бы сделать DR абстрактным и добавить к нему метод:

abstract class DR {
   public String getFilter();
}

class SQLDR {
   String sql;
   public String getFilter() {
       return sql;
   }
}

class PDR {
   Predicate predicate;
   public String getFilter() {
       return toString(predicate);
   }
}

И затем использовать это новое свойство в преобразователе без каких-либо условий:

<sql id="DOWNLOAD_FIELD_TYPES">
    #{key,jdbcType=VARCHAR},
    #{request.filter},
    #{status,jdbcType=OTHER},
    #{size,jdbcType=BIGINT},
    #{request.format,jdbcType=OTHER},
</sql>
...