2015-09-14 40 views
3

你好StackOverflowers,MyBatis - 根据javaType的返回结果地图

有一些我没有得到关于MyBatis resultMap。

我工作的这个模型beeing更新。我们决定创建一个反映我们未来数据库模式的对象的新图形(当前的图形很糟糕)。

总结我们的问题,这里是一个简单的例子: 当前对象whith与表SITE相关的是org.example.model.SiteModel。我们创建了一个名为org.example.entity.Site的新对象。 (包名称是临时的)。

目标是现在使用开发的MyBatis感谢的现有SQL请求,并添加一个新的ResultMap链接到我们的方法的返回类型。

这里有一个例子:

/** 
* Get all site defined as template. 
*/ 
@Select("SELECT * FROM SITE WHERE ISTEMPLATE = 'True'") 
@ResultMap({"siteResMap" , "siteResultMap"}) 
@Options(statementType = StatementType.CALLABLE) 
<T> List<T> findTemplates(); 

然后,在一个XML配置文件中,我们定义了以下映射:

... 
<resultMap id="siteResMap" type="org.example.entity.Site" /> 
<resultMap id="siteResultMap" type="org.example.model.SiteModel" /> 
... 

然后我们调用方法从我们的DAO:

List<Site> site = siteDao.findTemplates(); 
List<SiteModel> siteMod = siteDao.findTemplates(); 

我们期待从这是MyBatis的动态解释,采取正确的Resul tMap根据计算的返回类型。

但是这两个列表都显示为List<org.example.entity.Site> from debuger。

enter image description here

这让我觉得第一的ResultMap取,忽略了第二个。

我错过了什么吗?有没有办法让MyBatis以这种方式行事?

问候

回答

1

了很多的研究和探索的代码后,我们发现结果映射String[]没有设计到Java返回类型链接到的结果映射。

这是函数检索结果映射(从org.apache.ibatis.executor.resultset.DefaultResultSetHandler

public List<Object> handleResultSets(Statement stmt) throws SQLException { 
    ErrorContext.instance().activity("handling results").object(mappedStatement.getId()); 

    final List<Object> multipleResults = new ArrayList<Object>(); 

    int resultSetCount = 0; 
    ResultSetWrapper rsw = getFirstResultSet(stmt); 

    List<ResultMap> resultMaps = mappedStatement.getResultMaps(); 
    int resultMapCount = resultMaps.size(); 
    validateResultMapsCount(rsw, resultMapCount); 
    while (rsw != null && resultMapCount > resultSetCount) { 
     ResultMap resultMap = resultMaps.get(resultSetCount); 
     handleResultSet(rsw, resultMap, multipleResults, null); 
     rsw = getNextResultSet(stmt); 
     cleanUpAfterHandlingResultSet(); 
     resultSetCount++; 
    } 

    String[] resultSets = mappedStatement.getResulSets(); 
    if (resultSets != null) { 
     while (rsw != null && resultSetCount < resultSets.length) { 
     ResultMapping parentMapping = nextResultMaps.get(resultSets[resultSetCount]); 
     if (parentMapping != null) { 
      String nestedResultMapId = parentMapping.getNestedResultMapId(); 
      ResultMap resultMap = configuration.getResultMap(nestedResultMapId); 
      handleResultSet(rsw, resultMap, null, parentMapping); 
    } 
     rsw = getNextResultSet(stmt); 
     cleanUpAfterHandlingResultSet(); 
     resultSetCount++; 
     } 
    } 

    return collapseSingleResultList(multipleResults); 
} 

它解释了为什么我们总能得到类型的第一个结果映射的元素列表。

我们创建了一个新的Dao来映射新的对象类型。

相关问题