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列每個值傳遞給子查詢進行一對多查詢

官方文檔

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章