首页 > 解决方案 > 将 Pair 列表传递给 myBatis

问题描述

我需要一个 Pair to MyBatis 查询列表:

在映射器中:

List<Usage> getUsageByUserLanguagesAndDates(
      @Param("userLanguagePairList") List<Pair<String, String>> userLanguageMap,
      @Param("startDate") DateTime startDate,
      @Param("endDate") DateTime endDate)

List> userLanguageMap 看起来像这样:

List<Pair<String, String>> pairs = Lists.newArrayList;
pairs.add(new Pair("12345", "en-US"));
pairs.add(new Pair("23456", "en-GB"));
...

查询如下所示:

SELECT
    ...
    FROM
    ...
    WHERE 1=1
    AND 
    (
        (l.userid = '12345' AND ll.language_code = 'en-US') OR
        (l.userid = '23456' AND ll.language_code = 'en-GB') 
    )
   ;

我尝试将查询编写为:

AND (
    <foreach item="userLanguagePair" index="index" collection="userLanguagePairList" open="" separator="," close="">
      (
        l.userid = #{userLanguagePair.first}
        AND
        ll.language_code = #{userLanguagePair.second}
      )
      OR
    </foreach>
    )

...

但最后会有一个额外的 OR:

AND 
        (
            (l.userid = '12345' AND ll.language_code = 'en-US') OR
            (l.userid = '23456' AND ll.language_code = 'en-US') OR
        )

我怎样才能摆脱最后一个'OR'?

标签: mybatis

解决方案


来自http://www.mybatis.org/mybatis-3/dynamic-sql.html

<foreach item="item" index="index" collection="list" open="(" separator="," close=")">,

所以我会说你的代码应该是这样的:

...
WHERE 1=1 AND (
<foreach item="userLanguagePair" index="index" collection="userLanguagePairList" open="(" separator="OR" close=")">
    l.userid = #{userLanguagePair.first}
    AND
    ll.language_code = #{userLanguagePair.second}
</foreach>
)

但现在我无法检查这是否会生成正确的句子。


推荐阅读