Mybatis foreach mapper 项异常

Mybatis foreach mapper item exception

我正在为 SELECT IN 子句使用 foreach

映射器未找到项目。

这是例外的一部分。

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [ids, param1]] with root cause

org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [ids, param1]
        at org.apache.ibatis.binding.MapperMethod$ParamMap.get(MapperMethod.java:212) ~[mybatis-3.5.9.jar:3.5.9]
        at org.apache.ibatis.reflection.wrapper.MapWrapper.get(MapWrapper.java:45) ~[mybatis-3.5.9.jar:3.5.9]
        at org.apache.ibatis.reflection.MetaObject.getValue(MetaObject.java:122) ~[mybatis-3.5.9.jar:3.5.9]
        at org.apache.ibatis.executor.BaseExecutor.createCacheKey(BaseExecutor.java:219) ~[mybatis-3.5.9.jar:3.5.9]
        at org.apache.ibatis.executor.CachingExecutor.createCacheKey(CachingExecutor.java:146) ~[mybatis-3.5.9.jar:3.5.9]
        at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:88) ~[mybatis-3.5.9.jar:3.5.9]
        at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:151) ~[mybatis-3.5.9.jar:3.5.9]
        at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:145) ~[mybatis-3.5.9.jar:3.5.9]
        at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140) ~[mybatis-3.5.9.jar:3.5.9]
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]

找到了param ids,但也找到了不存在的param1。

下面是sql在@Select注释中使用。

select a.* from ACTOR
<if test="ids != null and ids.size > 0">
    where a.ID in 
    <foreach collection="ids" item="id" separator="," close=")" open="(">
        #{id}
    </foreach>
</if>

接口方法定义为

public List<Actor> listByIds(@Param("ids")List<Long> ids);

我已经在其他地方和其他 sql 查询中使用 foreach,这是唯一一个问题。

Select 注释必须包含 script 标签,例如foreach 将被使用,如下例所示。

@Select("""
<script>
select a.* from ACTOR
<if test="ids != null and ids.size > 0">
    where a.ID in 
    <foreach collection="ids" item="id" separator="," close=")" open="(">
        #{id}
    </foreach>
</if>
</script>
        """)
public List<Actor> listByIds(@Param("ids")List<Long> ids);

否则,参数映射器将尝试在函数签名中查找 id 参数而不是 foreach,因为它不知道它是脚本。