MyBatis version
3.4.5, 3.4.6 as well
Database vendor and version
mysql 5.6.21 (this issue is not related to db per se)
Test case or example project
Steps to reproduce
when querying
public List<QuestionnaireSent> selectByIds(Integer[] ids) {
return commonSession.selectList("QuestionnaireSentMapper.selectByIds", ImmutableMap.of("ids", ids));
}
SELECT *
FROM
t_questionnaire<if test="ids.length > 0">
WHERE
idin
<foreach collection="ids" open="(" separator="," close=")" item="id">
#{id}
</foreach>
</if>
LIMIT #{ids.length}
Expected result
Actual result
it throws Caused by: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'length' in 'class [Ljava.lang.Integer;' at org.apache.ibatis.reflection.Reflector.getGetInvoker(Reflector.java:419) at org.apache.ibatis.reflection.MetaClass.getGetInvoker(MetaClass.java:164) at org.apache.ibatis.reflection.wrapper.BeanWrapper.getBeanProperty(BeanWrapper.java:162) at org.apache.ibatis.reflection.wrapper.BeanWrapper.get(BeanWrapper.java:49) at org.apache.ibatis.reflection.MetaObject.getValue(MetaObject.java:122) at org.apache.ibatis.reflection.MetaObject.getValue(MetaObject.java:119) at org.apache.ibatis.executor.BaseExecutor.createCacheKey(BaseExecutor.java:219) at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:135) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:433)
Comment From: harawata
Thanks for the report, @sage417 !
This is not a bug, though.
ids.length
is an OGNL expression, but the expression in #{}
is evaluated by MyBatis, not by OGNL.
You may need to pass the array length as a statement parameter or use <bind />
.
<bind name="idCount" value="ids.length" />
LIMIT #{idCount}