在mybatis做association的关联时,后台执行了association的 查询语句,但是得到的结果中association关联的对象为null。
代码截图如下
好像只限于association的select返回resultMap类型,之前也用过resultType,返回的也是null,改成Map就没事了,不知道是不是bug
http://cczakai.iteye.com/blog/1276722 可以参考这篇文章
我跟楼上感觉差不多,通过嵌套结果查询的需要加上resultMap, 不行你用嵌套查询来做一遍, association column=xxid javaType=实体类 property=recruiType select=你命名空间下的那个查询的方法 你试试看这个好不好用
association里面需要配置recruitType属性的jdbcType和javaType的映射。
mybatis官网文档不是说明,不要使用这种方式吗?
推荐使用以下样式:
javaType="com.mk.dao.vo.Person">
<sql id="base">
p.id,p.name,p.age,p.position,po.pId AS ID,po.pName AS name
</sql>
<!-- -->
<select id="selectByPrimaryKey" resultMap="BaseResultMap"
parameterType="java.lang.String">
SELECT
<include refid="base" />
FROM tbl_person AS p
JOIN tbl_position AS po
ON p.position=po.pName
</select>
<resultMap id="BaseResultMap" type="com.mk.dao.vo.Position">
<id column="ID" property="ID" />
<result column="name" property="name" jdbcType="VARCHAR" />
<association column="person" property="person"
javaType="com.mk.dao.vo.Person">
<id column="id" property="id" jdbcType="VARCHAR" />
<result column="name" property="name" jdbcType="VARCHAR" />
<result column="age" property="age" jdbcType="INTEGER" />
</association>
</resultMap>
这个问题是源于resultMap和resultType的区别。
resultMap是必须手动指定表字段名和POJO类里面属性的映射关系
而resultType则是当POJO类里面的属性名称和表字段的名称一模一样的时候,可以自动匹配一一对应的关系,
所以说你这个使用了resultType,当程序执行完,虽然查到了结果,但是由于你POJO类的属性名称和表字段名不匹配
这就造成了查出的结果集不能装进POJO类,所以最后这个POJO类实例就会为Null
改法除了改用resultMap手动指定对应关系外,那就只能改POJO类里属性的命名了。
要不就用多表查询吧,你这个用N+1查询,本身也就影响效率的,left join 一哈,后面写多写个association映射吧,类似下面