MyBatis - 根据 javaType 的 ResultMap
MyBatis - ResultMap according to javaType
你好 Whosebugers,
MyBatis resultMap 有一些我不明白的地方。
我正在处理的模型正在更新中。我们决定创建一个新的对象图来反映我们未来的数据库模式(当前的模式很糟糕)。
为了总结我们的问题,这里有一个简单的案例:
与 table 站点相关的当前对象是 org.example.model.SiteModel
。我们创建了一个名为 org.example.entity.Site
的新对象。 (包名是临时的)。
现在的目标是使用由 MyBatis 开发的现有 SQL 请求,并添加一个链接到我们方法的 return 类型的新 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 的动态解释,根据计算的 return 类型获取正确的 ResultMap。
但是两个列表在调试器中都显示为 List<org.example.entity.Site>
。
这让我觉得第一个 ResultMap 被占用了,忽略了第二个。
我是不是漏掉了什么?有没有办法让 MyBatis 以这种方式运行?
此致
经过大量的研究和代码探索,我们发现ResultMap的String[]
并不是设计成resultMap的link java return类型。
这是检索结果图的函数(来自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 来映射新的对象类型。
你好 Whosebugers,
MyBatis resultMap 有一些我不明白的地方。
我正在处理的模型正在更新中。我们决定创建一个新的对象图来反映我们未来的数据库模式(当前的模式很糟糕)。
为了总结我们的问题,这里有一个简单的案例:
与 table 站点相关的当前对象是 org.example.model.SiteModel
。我们创建了一个名为 org.example.entity.Site
的新对象。 (包名是临时的)。
现在的目标是使用由 MyBatis 开发的现有 SQL 请求,并添加一个链接到我们方法的 return 类型的新 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 的动态解释,根据计算的 return 类型获取正确的 ResultMap。
但是两个列表在调试器中都显示为 List<org.example.entity.Site>
。
这让我觉得第一个 ResultMap 被占用了,忽略了第二个。
我是不是漏掉了什么?有没有办法让 MyBatis 以这种方式运行?
此致
经过大量的研究和代码探索,我们发现ResultMap的String[]
并不是设计成resultMap的link java return类型。
这是检索结果图的函数(来自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 来映射新的对象类型。