欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

MyBatis——@Result注解column参数传递——父查询函数的参数传递到子查询

发布时间:2024/10/5 编程问答 47 豆豆
生活随笔 收集整理的这篇文章主要介绍了 MyBatis——@Result注解column参数传递——父查询函数的参数传递到子查询 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

问题描述

假设a方法中传入一个带查询参数x

但是a方法的查询结果中不包含参数x

而子查询里也需要参数x

如何在子查询b中带入参数x

/*** 按User表中platform查询User*/@Select("select * from user where pid = #{id}")List<User> findUsers(int id);/*** 一对多查询*/@Select("select * from platform where 1 = 1")@Results({/*@Result(property = "id" , column = "id"),*/@Result(property = "users",/*javaType = List.class,*///对platform表中id属性进行一对多查询column = "id",many = @Many(select = "mybatis.mapper.HelloMapper.findUsers"))})List<Platform> getPlatforms();
  • findUsers需要传入一个参数 -> 即使用platform表中id 可自动带入进行一对多查询
  • @Result中column = "id"
  • 表示把父查询中id列每个值传递给子查询进行一对多查询

官方文档

propertydescription
column数据库的列名或者列标签别名。与传递给resultSet.getString(columnName)的参数名称相同。注意: 在处理组合键时,您可以使用column=“{prop1=col1,prop2=col2}”这样的语法,设置多个列名传入到嵌套查询语句。这就会把prop1和prop2设置到目标嵌套选择语句的参数对象中。

问题分析

根据官方文档,column是从resultSet获取,所以无法直接获取父函数的参数

可以把所需参数放进SQL查询中保存起来,并取一个别名。

解决方案

表 shoppingcart :购物车 主要包含商家id字段,商品id及信息,顾客id等等

为了某个顾客显示先购物车中商家,再显示商家中商品,需要传入一个顾客id

查询商家需要顾客id作为查询条件,查询商品需要商家id和顾客id两个条件

如果按以上的方法,(商家表中没有顾客id)无法传递顾客参数

(假设仅传递一个商家id参数的话,子查询两个参数都会被设定为商家id值进行查询)

思路:把顾客id放进查询中保存起来,并给他取一个别名

这样之后,顾客id即可传递给子查询
 

/*** 按顾客id查询其购物车(商家->商品 一对多查询)* @param consumerId 顾客id* @return 购物车商品列表*/@Select("select distinct saler.id,saler.shopname,#{consumerId} as consumerId from shoppingcart \n" +"join saler on saler.id = shoppingcart.salerId")@Results(@Result(property = "goods",column = "{salerId = id,consumerId = consumerId}",many = @Many(select = "cn.datacharm.springbootvuecli.dao.CartMapper.findGoodsBySalerId")))List<Shop> findCartById(Integer consumerId);@Select("select \n" +"sid,consumerId,productName,price,photo,\n" +"shoppingcart.salerId,\n" +"shoppingcart.productId,\n" +"shoppingcart.amount\n" +"from shoppingcart\n" +"join saler_inventory on shoppingcart.salerId = saler_inventory.salerId\n" +"and shoppingcart.productId = saler_inventory.productId\n" +"where shoppingcart.salerId = #{salerId}\n"+"and consumerId = #{consumerId}" )List<Goods> findGoodsBySalerId(Integer salerId,Integer consumerId); @Result中column = "{salerId = id,consumerId = consumerId}"

表示把id列和consumerId列取出

id列值使用salerId,consumerId列使用consumerId 表示(类似别名,对应子查询参数)

然后以这两个参数进行子查询

参考文章

https://blog.csdn.net/weixin_43297055/article/details/93635950

https://blog.csdn.net/weixin_43272781/article/details/106439505

与50位技术专家面对面20年技术见证,附赠技术全景图

总结

以上是生活随笔为你收集整理的MyBatis——@Result注解column参数传递——父查询函数的参数传递到子查询的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。