使用mybaties 嵌套查询注意
<?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.demo.mapper.CommentMapper">
<resultMap id="commentList" type="Comment">
<!-- 注意:当时设置 parameterType="Integer" 后,由于查找出来可能是其他类型,所有会报错,建议删掉 -->
<collection
property="child"
javaType="ArrayList"
ofType="Comment"
select="queryByCommentId"
column="{id=id}">
</collection>
</resultMap>
<select id="queryByShopId" resultType="Comment">
select * from comment
where
is_delete = 0
and
is_delete=0
and
shop_id = #{shopId}
and
parent_id is null
</select>
<!-- 注意:当时设置 parameterType="Integer" 后,由于查找出来可能是其他类型,所有会报错,建议删掉 -->
<select id="queryByCommentId" resultMap="commentList">
select c2.id id,c2.is_delete,c2.op_first,c2.op_first_time,
c2.op_last,c2.op_last_time,c2.shop_id,c2.name,c2.context,
c2.id_parent,c2.parent_id
from comment c1
left join comment c2
on c1.id = c2.parent_id
<where>
c1.is_delete = 0
and
c2.is_delete=0
and
c2.parent_id = #{id}
</where>
</select>
</mapper>
使用 collection 时注意事项
- 必须使用 父查询中 已将查询出来的字段,进行参数传递
- 限制 select 中的 查询语句,类型,不能指定成某一种
在本实例中 queryByCommentId 的映射mapper,不能设置 parameterType="Integer", 因为后来发现,传递的id 在下一次查询中 ,变成了 Long 类型 - 但使用 单个 column 是,可以省略,在当前实例中 可以携程 column="id"
- 可以跨文件使用 select ,但必须加上 namespace ,以 “全包名.方法” 的方式,进行使用,该实例中 可以写成 select="com.example.demo.mapper.CommentMapper.queryByCommentId"
- javaType 和 ofType 可写可不写