您好StackOverflowers,

关于MyBatis resultMap,我有些不了解。

我正在研究的模型正在更新。我们决定创建一个新的对象图,以反映我们 future 的数据库模式(当前状态很糟)。

总结一下我们的问题,这是一个简单的情况:
与表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的动态解释,根据计算出的返回类型获取正确的ResultMap。

但是两个列表都显示为调试器的List<org.example.entity.Site>

mybatis - MyBatis-根据javaType的ResultMap-LMLPHP

它使我认为采用了第一个ResultMap,而忽略了第二个。

我想念什么吗?有没有办法使MyBatis以这种方式行事?

问候

最佳答案

经过大量研究和代码探索,我们发现ResultMap的String[]并非旨在将Java返回类型链接到resultMap。

这是检索结果图的函数(从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);
}

它解释了为什么我们总是得到第一个resultMap类型的元素列表。

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

07-24 12:28