溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2022-03-23 09:07:14 來源:億速云 閱讀:1069 作者:iii 欄目:開發技術

本篇內容介紹了“mybatis使用foreach查詢不出結果也不報錯的問題怎么解決”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

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

首先,執行的時候語法沒有報錯,其次sql語句拿到數據庫去執行能查到數據,但是在接口這邊返回空輸數據,查看控制臺發現sql語句執行了,但是返回結果為0。此時猜想是傳入參數的問題。

執行結果

此時數組是直接從參數里接收

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

仔細看此時的數組和普通的數組還是有差別的

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

但是此時執行是沒有問題的,但是查不到數據

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

正確執行結果

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

此時的數組

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

遍歷輸出

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

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

正確做法

由于接收到的數組是json數組,不能直接使用,要轉成普通數組即可

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

前端傳入參數(數組即可)

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

使用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>

“mybatis使用foreach查詢不出結果也不報錯的問題怎么解決”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女