Loading

使用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 时注意事项

  1. 必须使用 父查询中 已将查询出来的字段,进行参数传递
  2. 限制 select 中的 查询语句,类型,不能指定成某一种
    在本实例中 queryByCommentId 的映射mapper,不能设置 parameterType="Integer", 因为后来发现,传递的id 在下一次查询中 ,变成了 Long 类型
  3. 但使用 单个 column 是,可以省略,在当前实例中 可以携程 column="id"
  4. 可以跨文件使用 select ,但必须加上 namespace ,以 “全包名.方法” 的方式,进行使用,该实例中 可以写成 select="com.example.demo.mapper.CommentMapper.queryByCommentId"
  5. javaType 和 ofType 可写可不写
posted @ 2024-01-04 13:04  小小的编程员  阅读(12)  评论(0编辑  收藏  举报