如何将注释与 iBatis (myBatis) 一起使用以进行 IN 查询?

2022-09-01 09:13:40

我们只想在MyBatis中使用注释;我们真的在努力避免xml。我们尝试使用“IN”子句:

@Select("SELECT * FROM blog WHERE id IN (#{ids})") 
List<Blog> selectBlogs(int[] ids); 

MyBatis似乎无法挑选出int数组并将其放入结果查询中。它似乎“软性地失败了”,我们没有得到任何结果。

看起来我们可以使用XML映射来实现这一点,但我们真的想避免这种情况。是否有正确的注释语法?


答案 1

我相信答案与这个问题给出的答案相同。您可以通过执行以下操作在注释中使用 myBatis 动态 SQL:

@Select({"<script>",
         "SELECT *", 
         "FROM blog",
         "WHERE id IN", 
           "<foreach item='item' index='index' collection='list'",
             "open='(' separator=',' close=')'>",
             "#{item}",
           "</foreach>",
         "</script>"}) 
List<Blog> selectBlogs(@Param("list") int[] ids);

该元素为批注启用动态 SQL 分析和执行。它必须是查询字符串的第一个内容。它前面必须没有任何东西,甚至不是空白。<script>

请注意,您可以在各种 XML 脚本标记中使用的变量遵循与常规查询相同的命名约定,因此,如果要使用“param1”、“param2”等以外的名称来引用方法参数,您需要在每个参数前面加上一个@Param注释。


答案 2

我相信这是jdbc准备好的声明的细微差别,而不是MyBatis。这里有一个链接,解释了这个问题,并提供了各种解决方案。不幸的是,这些解决方案都不适用于您的应用程序,但是,了解预准备语句在“IN”子句方面的局限性仍然是一个很好的阅读。可以在数据库特定的方面找到解决方案(也许是次优的)。例如,在postgresql中,可以使用:

"SELECT * FROM blog WHERE id=ANY(#{blogIds}::int[])"

“ANY”与“IN”相同,“::int[]”是将参数类型转换为int数组。输入到语句中的参数应如下所示:

"{1,2,3,4}"

推荐