情景:查詢資料庫中文章的相關文章 文章為一個表 欄位tags為相關文章字串中間用','逗號進行啦分割
查詢完一個文章後可以把tags欄位構造為一個List<String> 然後利用這個集合作為條件來查詢
<select id="selectTestForEach" parameterType="News" resultMap="NewsResultMapper">
select * from t_news n where
<foreach collection="listTag" index="index" item="tag" open="("
separator="," close=")">
#{tag} in n.tags
</foreach>
</select>
看。 foreach 生成的效果是集合 轉化為下面的
select * from t_news n where ( ? in n.tags , ? in n.tags )
foreach元素的屬性主要有 item,index,collection,open,separator,close。
item表示集合中每一個元素進行迭代時的別名.
index指 定一個名字,用於表示在迭代過程中,每次迭代到的位置.
open表示該語句以什麼開始,separator表示在每次進行迭代之間以什麼符號作為分隔 符.
close表示以什麼結束.
<select id="selectTestForEach" parameterType="News" resultMap="NewsResultMapper">
select * from t_news n where
<foreach collection="listTag" index="index" item="tag" open=""
separator="or" close="">
#{tag} in n.tags
</foreach>
</select>
所以 去除左右括號 和 把,改成 or 進行 。 就可以轉化為這種形式。
select * from t_news n where ? in n.tags or ? in n.tags 這樣可以用List<String> 來查。
但是查不到資料
需要使用如下方式:
<select id="selectTestForEach" parameterType="News" resultMap="NewsResultMapper">
select * from t_news n where
<foreach collection="listTag" index="index" item="tag" open=""
separator="or" close="">
n.tags like '%'||#{tag}||'%'
</foreach>
<select>
生成的SQL為
select * from t_news n where n.tags like ? or n.tags like ?
foreach : 用的更多的地方為: 根據Id批量刪除 / 判斷什麼 in 集合中(此時需要生成(**,***,)的形式)