【问题标题】:MyBatis - ResultMap according to javaTypeMyBatis - 根据 javaType 的 ResultMap
【发布时间】:2015-09-14 10:17:46
【问题描述】:

你好 StackOverflowers,

MyBatis resultMap 有一些我不明白的地方。

我正在处理的模型正在更新。我们决定创建一个新的对象图来反映我们未来的数据库架构(当前的架构很糟糕)。

总结一下我们的问题,这里有一个简单的案例: 当前与表 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&lt;org.example.entity.Site&gt;

这让我觉得第一个 ResultMap 被拿走了,而忽略了第二个。

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

问候

【问题讨论】:

    标签: mybatis spring-mybatis


    【解决方案1】:

    经过大量研究和代码探索,我们发现 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 来映射新的对象类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-23
      • 1970-01-01
      • 2014-01-30
      • 1970-01-01
      • 2012-11-10
      • 2018-12-07
      • 2020-11-29
      相关资源
      最近更新 更多