MyBatis在SQL語句中取list的大小

槑孒發表於2024-10-18

需求:使用MyBatis進行開發時,在一個SQL語句中需要拼接list的大小。

大家都知道,當我們在MyBatis中寫SQL時,如果需要遍歷list,先對list進行非空判斷的時候,可以加下面這行:

<if test="null != list and list.size != 0">SQL</if>

但是如果想在SQL中取到list.size的值,則比較麻煩。一般會想到如下:

<select id="getArticleIdByTags" parameterType="java.util.List" resultType="java.lang.Integer">
    SELECT id
    FROM table_name
    where 1=1
    <foreach collection="list" item="item" open="AND" separator="OR" close="GROUP BY id HAVING COUNT(*) >=">
        field1 = #{item.a} AND field2 = #{item.b}
    </foreach>
    #{list.size}
</select>

但是你會發現報錯了,PersistenceExceptionUnsupportOperationException

因為list.size用#{}是取不出來的,需要用${},把#換成$就可以了。

使用#{}能夠有效防止SQL隱碼攻擊,但是也有它的缺點,它會把傳入的資料自動加上一個雙引號,所以如果要的是數字的話,就會比較尷尬。

而${}可以直接解析出原本的資料,所以需要數值比較的話,還是要加${}

轉載自https://www.jianshu.com/p/9d542c65c32c

相關文章