Closed
Description
If a TypeHandler for the Map class is registered, it gets invoked inappropriately when a mapper method uses multiple parameters.
For example, a TypeHandler:
@MappedTypes(Map.class)
public class LabelsTypeHandler implements TypeHandler<Map<String, Object>> { ... }
Then these methods in the mapper interface:
@Select("SELECT #{myId};")
int echoSingle(@Param("myId") long myId);
@Select("SELECT #{myId};")
int echoMulti(@Param("myId") long myId, @Param("yourId") int yourId);
The first method, with just one parameter, succeeds, while the second method fails with a stack trace that ends with:
### Error querying database. Cause: java.lang.ClassCastException: java.lang.Long cannot be cast to java.util.Map
### The error may exist in org/example/persistence/SomeMapper.java (best guess)
### The error may involve org.example.persistence.SomeMapper.echoMulti-Inline
### The error occurred while setting parameters
### SQL: SELECT ?;
### Cause: java.lang.ClassCastException: java.lang.Long cannot be cast to java.util.Map
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:23)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:107)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:98)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:62)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:358)
... 35 more
Caused by: java.lang.ClassCastException: java.lang.Long cannot be cast to java.util.Map
at org.example.typehandler.LabelsTypeHandler.setParameter(LabelsTypeHandler.java:1)
at org.apache.ibatis.scripting.defaults.DefaultParameterHandler.setParameters(DefaultParameterHandler.java:77)
at org.apache.ibatis.executor.statement.PreparedStatementHandler.parameterize(PreparedStatementHandler.java:77)
at org.apache.ibatis.executor.statement.RoutingStatementHandler.parameterize(RoutingStatementHandler.java:58)
at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:71)
at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:56)
at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:259)
at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:132)
at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:115)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:104)
... 42 more