需要迭代来自 java 的列表并将多个值传递给 iBatis sql 查询的 LIKE 子句
need to iterate list which is from java and pass multiple values to LIKE clause of iBatis sql query
我是 myBatis 的新手,我需要迭代来自 java 的列表 merchantOrderNums,列表可以包含单个元素或多个元素。然后我需要将列表元素传递给 iBatis 的 LIKE 子句 sql query.The 生成的 sql 查询必须是这样的
select count(*)
from message msg
WHERE msg.spec_id = 50
AND msg.mrch_ordr_id LIKE '%ABC%'
OR msg.mrch_ordr_id LIKE '%123%';
但它正在生成
select count(*) from message msg
WHERE msg.spec_id = 50
AND msg.mrch_ordr_id LIKE '%ABC%'
AND msg.mrch_ordr_id LIKE '%123%';
iBatis 查询,我正在尝试的是:
<select id="getTransactions" parameterType="SearchCriteria" resultMap="transactions" fetchSize="250">
select count(*) from message msg
<where>
msg.spec_id = 50
<if test="merchantOrderNums != null">
<foreach item="item" index="index" collection="merchantOrderNums">
AND msg.mrch_ordr_id LIKE '%${item}%'
<trim prefix="OR" prefixOverrides="AND">
</trim>
</foreach>
</if>
</select>
查询应如下所示:
<select id="getTransactions" parameterType="SearchCriteria"
resultMap="transactions" fetchSize="250">
select count(*) from message msg
where msg.spec_id = 50
<if test="merchantOrderNums != null">
AND (
<foreach item="item" index="index" collection="merchantOrderNums"
separator=" OR " >
msg.mrch_ordr_id LIKE '%${item}%'
</foreach>
)
</if>
</select>
记下您遇到的问题:
foreach
里面有AND
。这意味着 mechantOrderNums
的元素将与 AND
连接
- 您可能想要生成类似
msg.spec_id = 50 AND (msg.mrch_ordr_id LIKE '%ABC%' OR msg.mrch_ordr_id LIKE '%123%')
的查询,因为 AND
具有更高的优先级,因此在析取周围使用括号。
- 您使用
trim
不正确。在这种情况下,根本不需要。查看 documentation 以了解如何以及何时使用它。
我是 myBatis 的新手,我需要迭代来自 java 的列表 merchantOrderNums,列表可以包含单个元素或多个元素。然后我需要将列表元素传递给 iBatis 的 LIKE 子句 sql query.The 生成的 sql 查询必须是这样的
select count(*)
from message msg
WHERE msg.spec_id = 50
AND msg.mrch_ordr_id LIKE '%ABC%'
OR msg.mrch_ordr_id LIKE '%123%';
但它正在生成
select count(*) from message msg
WHERE msg.spec_id = 50
AND msg.mrch_ordr_id LIKE '%ABC%'
AND msg.mrch_ordr_id LIKE '%123%';
iBatis 查询,我正在尝试的是:
<select id="getTransactions" parameterType="SearchCriteria" resultMap="transactions" fetchSize="250">
select count(*) from message msg
<where>
msg.spec_id = 50
<if test="merchantOrderNums != null">
<foreach item="item" index="index" collection="merchantOrderNums">
AND msg.mrch_ordr_id LIKE '%${item}%'
<trim prefix="OR" prefixOverrides="AND">
</trim>
</foreach>
</if>
</select>
查询应如下所示:
<select id="getTransactions" parameterType="SearchCriteria"
resultMap="transactions" fetchSize="250">
select count(*) from message msg
where msg.spec_id = 50
<if test="merchantOrderNums != null">
AND (
<foreach item="item" index="index" collection="merchantOrderNums"
separator=" OR " >
msg.mrch_ordr_id LIKE '%${item}%'
</foreach>
)
</if>
</select>
记下您遇到的问题:
foreach
里面有AND
。这意味着mechantOrderNums
的元素将与AND
连接
- 您可能想要生成类似
msg.spec_id = 50 AND (msg.mrch_ordr_id LIKE '%ABC%' OR msg.mrch_ordr_id LIKE '%123%')
的查询,因为AND
具有更高的优先级,因此在析取周围使用括号。 - 您使用
trim
不正确。在这种情况下,根本不需要。查看 documentation 以了解如何以及何时使用它。