mybatis中的默认构造函数,带有复杂参数

时间:2016-09-07 09:38:35

标签: java constructor mybatis

假设我们有以下课程:

public final class PersonDso {

    public final PersonDto personDto;

    public PersonDso(final Person personDto) {
        this.personDto = personDto;
    }

    public String getName(){return personDto.getName()}; 
    public String getEmail(){return personDto.getEmail()};

}

PersonDto类包含的字段多于名称和电子邮件。

所以,我在mybatis中创建了以下Mapper:

<mapper namespace="my.package.domain.PersonDataMapper">

    <resultMap id="personDsoMap" type="my.package.dso.PersonDso">
        <constructor>
            <arg column="person" javaType="my.package.dto.PersonDTO"/>
        </constructor>
        <id column="p_id"/>
        <association property="personDto" columnPrefix="p_" resultMap="my.package.mapper.PersonMapper.BaseResultMap"/>
    </resultMap>

    <select id="getPersons" resultMap="personDsoMap">
        select <includeColumns tableAlias="p" columnPrefix="p_" refid="my.package.mapper.PersonMapper.Base_Column_List"/>
        from PERSON p
    </select>

</mapper>

基本上如下。从查询我可以检索PersonDto,但我不想将我的Dto暴露给外部,这就是我创建PersonDso的原因。 personDso有一个字段personDto,我希望MyBatis通过将PersonDto传递给构造函数来创建PersonDso。

使用此代码,MyBatis抱怨道:

Error parsing Mapper XML. Cause: java.lang.IllegalStateException: No typehandler found for property null

1 个答案:

答案 0 :(得分:0)

javaType 属性对于选择哪个构造函数(基于声明的参数类型)非常重要。

引发错误,因为在构造函数arg中没有映射查询结果列。列不存在。

只需在 arg 标记中设置带有 resultMap 属性的映射:

<resultMap type="PersonDto" id="personDtoMap">
    <!-- column to property mapping if not implicit matching -->
</resultMap>

<resultMap type="PersonDso" id="personDsoMap">
    <constructor>
      <arg resultMap="personDtoMap" javaType="PersonDto"/>
    </constructor>
    <id column="p_id" property="id"/>
</resultMap>

<select id="getPersons" resultMap="personDsoMap"> [...] </select>

这种联系是徒劳的。