William He
William He

Reputation: 381

Mybatis: IllegalArgumentException: Mapped Statements collection does not contain value for xxx

I have two entities Vendor and Goods with one-to-many relation, the relation looks like:

enter image description here

I am using mybatis with annotation, the mapper:

GoodsMapper

public interface GoodsMapper {
    @Select("select * from goods where id=#{goodsId}")
    @Results({
            @Result(id = true, column = "id", property = "id"),
            @Result(column = "name", property = "name"),
            @Result(column = "vendor_id", property = "vendor", 
                 one = @One(select = "com.xxx.server.mapper.VendorMapper.getVendor"))
    })
    Goods getGoods(@Param("goodsId") String goodsId);
}

VendorMapper

public interface VendorMapper {

    @Select("select * from vendor where id=#{vendorId}")
    Vendor getVendor(@Param("vendorId") String vendorId);

}

ignore the entity code & others...

when I invoked goodsMapper.getGoods(goodsId), I caught the following exception :

Caused by: org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for com.xxx.server.mapper.VendorMapper.getVendor
### The error may exist in com/xxx/server/mapper/GoodsMapper.java (best guess)
### The error may involve com.xxx.server.mapper.GoodsMapper.getGoods
### The error occurred while handling results
### SQL: select * from goods where id=?
### Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for com.xxx.server.mapper.VendorMapper.getVendor
    at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:150)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:77)
    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)
    ... 117 more
Caused by: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for com.xxx.server.mapper.VendorMapper.getVendor
    at org.apache.ibatis.session.Configuration$StrictMap.get(Configuration.java:933)
    at org.apache.ibatis.session.Configuration.getMappedStatement(Configuration.java:726)
    at org.apache.ibatis.session.Configuration.getMappedStatement(Configuration.java:719)
    at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.getNestedQueryMappingValue(DefaultResultSetHandler.java:740)
    at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.getPropertyMappingValue(DefaultResultSetHandler.java:465)
    at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.applyPropertyMappings(DefaultResultSetHandler.java:441)

I have checked the class path com.xxx.server.mapper.VendorMapper.getVendor for the select of @One, it is correct.

Appreciate any kind help~

Upvotes: 0

Views: 3025

Answers (1)

Marax
Marax

Reputation: 334

In my case this was caused by referenced collection not being initialized by Spring yet.

Solution is to add @DependsOn annotation to the "parent" mapper.

@DependsOn("VendorMapper")
public interface GoodsMapper{
...
}

@Repository("VendorMapper")
public interface VendorMapper {
...
}

Upvotes: 1

Related Questions