Skip to content

TypeHandler to Map inappropriately invoked when method has multiple parameters #135

Closed
@usethe4ce

Description

@usethe4ce

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

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions