2016-10-24 32 views
0

我有取在MyBatis的结果转换成地图<整数,列表<Integer>>

id | dependencies 
----+-------------- 
    1 | {1,2,3,4,5} 
    2 | {2,3,4,5} 
    3 | {3,4,5} 
    4 | {4,5} 
    5 | {5} 
(5 rows) 

形式的结果的循环查询我需要这个数据映射到

HashMap<Integer, List<Integer>>, 
where 
column "id" becomes KEY 
column "dependencies" becomes VALUE 
(dependencies= postgres array obtained after array_agg) 

Apparantly用,的resultSet映射为

@Results(value={ 

      @Result(column="id", property="key", javaType=Integer.class), 
      @Result(column="dependencies", property="value", typeHandler=ArrayTypeHandler.class) 
    }) 


Im getting the results with return type as 
List<Map<Integer, List<Integer>>>, but they are not as expected 

有没有一种方法,我可以将结果直接映射到地图中?

+0

只是返回Map 在您的方法映射也许是正确的,发生了什么?你可以添加更多的信息,因为你得到的结果或类似的东西 – Pau

回答

0

你可以尝试ResultHandler:

// declared as "final" to be visible in the anonymous class scope 
final Map<Integer, String> result = new HashMap<Integer, String>(); 

ResultHandler resultHandler = new ResultHandler() { 
    @Override 
    public void handleResult(ResultContext resultContext) { 
     Map object = (Map) resultContext.getResultObject(); 
      result.put((Integer)object.get("id"), (String)object.get("dependencies")); 
     } 
    }; 

session.select("myStatement", resultHandler); 
LOGGER.info(result); 

你也可以做到这一点通过映射接口:

// declare in mapper interface 
@ResultType(value=Map.class) 
@Results(value={ 
     @Result(column="id", property="id", javaType=Integer.class), 
     @Result(column="dependencies", property="dependencies", typeHandler=ArrayTypeHandler.class) 
}) 
void myStatement(ResultHandler resultHandler); 

// call 
session.getMapper(MyMapper.class).myStatement(resultHandler); 

您必须指定@ResultType如地图, 或引用@ResultMap(“myResultMap”)其映射在XML中定义,然后删除@Results。 否则一个BindingException抛出:MyStatement的需要在XML任一个@ResultMap注解,一个@ResultType 注释,或与resultType属性

方法,以便一个ResultHandler可以用作参数 。

相关问题