mybatis collection多层嵌套 (三层嵌套)

绝地灬酷狼 2022-04-02 09:52 1832阅读 0赞

mybatis 的collection 可以自动把查询结果转成一对多的对象结构,但是经测试只支持两层的结构,第三次并没有自动装配进去,所以采取这种办法,把其中一层拆出来先。

坑:我这里要往下传的参数 id 的类型是UUID ;model 里定义的是string 类型,但是在mybatis的查询查询过程中,它会去找java.util.uuid 这个类型,找不到所以就会报错,所以我在第一层的select里强制转换成varchar ,后续使用中再转回来

文字解说一下:

java那边请求findProductById(string id) 把id传到下面同名的select 里,这个select的resultMap是product ;

product 里面嵌套了子查询get-specs,最底下的查询get-specs的参数#{id}::uuid 就是主表查到的ID,并且由 column=”id” 这个配置决定

  1. <resultMap id="product"
  2. type="net.x.model.Product">
  3. <id property="id" column="id" />
  4. <result property="name" column="name" />
  5. <collection property="specs" column="id" ofType="net.x.model.Specification" select="get-specs" />
  6. </resultMap>
  7. <!-- 这里的ID 是从java的mapper那里传过来的 -->
  8. <select id="findProductById" resultMap="product">
  9. select
  10. p.id::varchar ,p.name
  11. from product p
  12. where p.flag != 'p' and p.id = #{id}::uuid
  13. </select>
  14. <!-- 这里用了一个list嵌套 ,为什么一开始不直接这样写呢,因为mybatis自动装配只能搞两层,我这个加起来三层了,所以只能分一层出来用select处理,你喜欢的话全部用select也行 -->>
  15. <resultMap id="specs" type="net.x.model.Specification">
  16. <id property="id" column="specification_id" />
  17. <result property="name" column="specification_name" />
  18. <collection property="options" ofType="net.x.model.SpecificationOption" javaType="list">
  19. <id property="id" column="specification_option_id" />
  20. <result property="value" column="specification_option_value" />
  21. </collection>
  22. </resultMap>
  23. <!--这个id是 最上面的resultMap里的collection标签里的column属性,把第一层查询的id作为参数带下来 -->
  24. <select id="get-specs" resultMap="specs">
  25. select
  26. s.id as specification_id , s.name as specification_name
  27. ,so1.id as specification_option_id , so1.value as specification_option_value
  28. from ps
  29. LEFT JOIN s on s.id = ps.specification_id
  30. LEFT join so1 on so1.specification_id = s.id
  31. where ps.product_id = #{id}::uuid
  32. </select>

发表评论

表情:
评论列表 (有 0 条评论,1832人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Vue嵌套路由()

    > 小编推荐:[Fundebug][]专注于JavaScript、微信小程序、微信小游戏,Node.js和Java实时BUG监控。真的是一个很好用的bug监控费服务,众多大佬公