假设我们有以下课程:
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
答案 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>
这种联系是徒劳的。