問題描述
假設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列每個值傳遞給子查詢進行一對多查詢
官方文檔
property | description |
---|---|
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