2015-09-14 75 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來映射新的對象類型。

相關問題