首頁 > 軟體

mybatis使用foreach查詢不出結果也不報錯的問題

2022-03-22 19:00:20

foreach查詢不出結果也不報錯問題

首先,執行的時候語法沒有報錯,其次sql語句拿到資料庫去執行能查到資料,但是在介面這邊返回空輸資料,檢視控制檯發現sql語句執行了,但是返回結果為0。此時猜想是傳入引數的問題。

執行結果

此時陣列是直接從引數裡接收

仔細看此時的陣列和普通的陣列還是有差別的

但是此時執行是沒有問題的,但是查不到資料

正確執行結果

此時的陣列

遍歷輸出

所以,由此可以看出是引數的問題

正確做法

由於接收到的陣列是json陣列,不能直接使用,要轉成普通陣列即可

前端傳入引數(陣列即可)

使用foreach、in操作注意點

mybatis語法掌握不熟,在寫foreach操作時,造成in ()錯誤,這種情況不符合SQL的語法,導致程式報錯。

如果簡單隻做非空判斷,這樣也有可能會有問題:本來in一個空列表,應該是沒有資料才對,卻變成了獲取全部資料!

錯誤sql範例

<select id="getActiveCount" resultType="int" parameterType="com.missfresh.active.dto.ActiveSearchDTO">
        select count(1) from (
        SELECT
        distinct  a.*
        FROM
        active AS a
        <if test="sku!='' and sku!=null">
            LEFT JOIN active_promotion AS ap ON ap.active_id = a.id
            LEFT JOIN promotion_product AS pp ON pp.promotion_id = ap.promotion_id
        </if>
        <if test="areaIds!='' and areaIds!=null">
            LEFT JOIN active_area AS aa ON aa.active_id = a.id and aa.status = 1 and aa.area_type = 0
        </if>
        WHERE a.status <![CDATA[!= ]]> 0
        <if test="id!=0 and id!=null">
            AND a.id = #{id}
        </if>
        <if test="name!='' and name!=null">
            AND a.name LIKE CONCAT('%',#{name},'%')
        </if>
        <if test="sku!='' and sku!=null">
            AND pp.sku = #{sku}
        </if>
        <!--判斷方式錯了,應該先用null再用size>0判斷;如果areaIds為空,查詢結果也應為空,而不是其他查詢結果。所以sql有問題-->
        <if test="areaIds!='' and areaIds!=null">
            and aa.area_id IN
            <foreach item="item" index="index" collection="areaIds" open="(" separator="," close=")">
                #{item}
            </foreach>
        </if>
        order by a.create_time desc ) as b
    </select>

改正後的sql為

<select id="getActiveCount" resultType="int" parameterType="com.missfresh.active.dto.ActiveSearchDTO">
        select count(1) from (
        SELECT
        distinct  a.*
        FROM
        active AS a
        <if test="sku!='' and sku!=null">
            LEFT JOIN active_promotion AS ap ON ap.active_id = a.id
            LEFT JOIN promotion_product AS pp ON pp.promotion_id = ap.promotion_id
        </if>
        <if test="areaIds!='' and areaIds!=null">
            LEFT JOIN active_area AS aa ON aa.active_id = a.id and aa.status = 1 and aa.area_type = 0
        </if>
        WHERE a.status <![CDATA[!= ]]> 0
        <if test="id!=0 and id!=null">
            AND a.id = #{id}
        </if>
        <if test="name!='' and name!=null">
            AND a.name LIKE CONCAT('%',#{name},'%')
        </if>
        <if test="sku!='' and sku!=null">
            AND pp.sku = #{sku}
        </if>
        <if test="areaIds!=null and areaIds.size > 0">
            and aa.area_id IN
            <foreach item="item" index="index" collection="areaIds" open="(" separator="," close=")">
                #{item}
            </foreach>
        </if>
        <!--加入這個非真條件-->
        <if test="areaIds==null or areaIds.size ==  0">
        and 1=0
        </if>
        order by a.create_time desc ) as b
    </select>

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com