如何在@SelectProvider类中使用MyBatis3中的<foreach>语句

时间:2015-04-22 16:28:03

标签: java sql dynamic foreach mybatis

我试图通过在@SelectProvider子句中使用标记foreach来使用IN来创建动态SQL。我知道如何使用@Select注释将其用于我的映射器。

问题在于,当我将SQL转换为SQLProvider时,似乎不会为调用SQLProvider方法获取SQL的代理直接使用标记。

以下是使用@Select

的代码示例
// imports...

public interface MyMapper {
    @Select({"<script>",
        "SELECT col_1, col_2", 
        "FROM table_1",
        "WHERE col_3 IN",
            "<foreach item='item' index='index' collection='items'",
                "open='(' separator=',' close=')'>",
                "#{item}",
            "</foreach>",
        "</script>"})
    HashMap<String, Object> select(@Param("items") String[] items);
}

上面的代码实际上有效,但是当我尝试使用@SelectProvider时,它不起作用。

这是我使用@SelectProvider时的代码:

// imports...

public interface MyMapper {
    @SelectProvider(type = MySQLProvider.class, method = "select")
    HashMap<String, Object> select(@Param("items") String[] items);
}

public class MySQLProvider {
    public String select() {
        SQL sql = new SQL();
        sql.SELECT("col_1");
        sql.SELECT("col_2");
        sql.FROM("table_1");
        sql.WHERE("col_3 IN"
            + "<foreach item='item' index='index' collection='items'"
                + "open='(' separator=',' close=')'>"
                + "#{item}"
            + "</foreach>");
        return "<script>" + sql.toString() + "</script>";
    }
}

当我使用MyMapper时,它会很好地处理SQL,但忽略scriptforeach语句。

任何人都可以提供包含代码的具体解决方案吗?

1 个答案:

答案 0 :(得分:3)

从MyBatis 3.5.1开始,现在可以处理SqlProvider方法中定义的<script>块。如果您升级到此版本,则您发布的代码应该可以使用。

请参见发行说明here上增强功能下的第一个要点。