我试图通过在@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,但忽略script
和foreach
语句。
任何人都可以提供包含代码的具体解决方案吗?
答案 0 :(得分:3)
从MyBatis 3.5.1开始,现在可以处理SqlProvider方法中定义的<script>
块。如果您升级到此版本,则您发布的代码应该可以使用。
请参见发行说明here上增强功能下的第一个要点。