Java 如何在MyBatis Dynamic SQL的带注释映射器中使用XML结果映射?

Java 如何在MyBatis Dynamic SQL的带注释映射器中使用XML结果映射?,java,mybatis,dynamic-sql,Java,Mybatis,Dynamic Sql,我正在尝试将MyBatis Dynamic SQL用于我的应用程序,在遵循关于如何将XML映射器与带注释的映射器一起使用的指导原则时遇到了一些问题,如上的“用于连接语句的XML映射器”中所述 我正在尝试使以下查询正常工作: SessionMapper=sqlSession.getMapper(SessionMapper.class); SessionTableSupport sessionMaster=新的SessionTableSupport(); SelectStatementProvide

我正在尝试将MyBatis Dynamic SQL用于我的应用程序,在遵循关于如何将XML映射器与带注释的映射器一起使用的指导原则时遇到了一些问题,如上的“用于连接语句的XML映射器”中所述

我正在尝试使以下查询正常工作:

SessionMapper=sqlSession.getMapper(SessionMapper.class);
SessionTableSupport sessionMaster=新的SessionTableSupport();
SelectStatementProvider stmt=选择(
sessionMaster.sessionId,
sessionMaster.module,
sessionMaster.startTime,
sessionMaster.endTime,
sessionMaster.eventId,
sessionMaster.userId)
.from(sessionMaster.sessionTable)
.where(sessionMaster.module,isEqualTo(“示例_模块”))
.build()
.render(RenderingStrategy.MYBATIS3);
列出sampleSessions=mapper.selectMany(stmt);
作为参考,配置文件如下所示:


... 
... 
然后,这里是我的xml映射器
SessionResultMapper.xml


下面是带注释的映射器接口
SessionMapper.java

@Mapper
public interface SessionMapper {
    @SelectProvider(type=SqlProviderAdapter.class, method="select")
    @ResultMap("SimpleResults")
    List<SessionResult> selectMany(SelectStatementProvider selectStatement);
}
使用xml和注释运行上述操作时,会引发以下异常:

Exception in thread "main" org.apache.ibatis.builder.IncompleteElementException: Could not find result map mappers.SessionMapper.SimpleResults
    at org.apache.ibatis.builder.MapperBuilderAssistant.getStatementResultMaps(MapperBuilderAssistant.java:346)
    at org.apache.ibatis.builder.MapperBuilderAssistant.addMappedStatement(MapperBuilderAssistant.java:290)
    at org.apache.ibatis.builder.annotation.MapperAnnotationBuilder.parseStatement(MapperAnnotationBuilder.java:364)
    at org.apache.ibatis.builder.annotation.MethodResolver.resolve(MethodResolver.java:33)
    at org.apache.ibatis.session.Configuration.lambda$buildAllStatements$3(Configuration.java:795)
    at java.util.Collection.removeIf(Collection.java:414)
    at org.apache.ibatis.session.Configuration.buildAllStatements(Configuration.java:794)
    at org.apache.ibatis.session.Configuration.hasStatement(Configuration.java:763)
    at org.apache.ibatis.session.Configuration.hasStatement(Configuration.java:758)
    at org.apache.ibatis.binding.MapperMethod$SqlCommand.resolveMappedStatement(MapperMethod.java:254)
    at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:224)
    at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:50)
    at org.apache.ibatis.binding.MapperProxy.lambda$cachedMapperMethod$0(MapperProxy.java:62)
    at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660)
    at org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.java:62)
    at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:57)
    at com.sun.proxy.$Proxy5.selectMany(Unknown Source)
    at test.TestMyBatisDynamic.main(TestMyBatisDynamic.java:70)
Caused by: java.lang.IllegalArgumentException: Result Maps collection does not contain value for mappers.SessionMapper.SimpleResults
    at org.apache.ibatis.session.Configuration$StrictMap.get(Configuration.java:933)
    at org.apache.ibatis.session.Configuration.getResultMap(Configuration.java:645)
    at org.apache.ibatis.builder.MapperBuilderAssistant.getStatementResultMaps(MapperBuilderAssistant.java:344)
    ... 17 more
线程“main”org.apache.ibatis.builder.IncomplementElementException中的异常:找不到结果映射映射程序.SessionMapper.SimpleResults 位于org.apache.ibatis.builder.MapperBuilderAssistant.getStatementResultMaps(MapperBuilderAssistant.java:346) 位于org.apache.ibatis.builder.MapperBuilderAssistant.addMappedStatement(MapperBuilderAssistant.java:290) 位于org.apache.ibatis.builder.annotation.MapperAnnotationBuilder.parseStatement(MapperAnnotationBuilder.java:364) 位于org.apache.ibatis.builder.annotation.MethodResolver.resolve(MethodResolver.java:33) 位于org.apache.ibatis.session.Configuration.lambda$buildAllStatements$3(Configuration.java:795) 位于java.util.Collection.removeIf(Collection.java:414) 位于org.apache.ibatis.session.Configuration.buildAllStatements(Configuration.java:794) 位于org.apache.ibatis.session.Configuration.hasStatement(Configuration.java:763) 位于org.apache.ibatis.session.Configuration.hasStatement(Configuration.java:758) 位于org.apache.ibatis.binding.MapperMethod$SqlCommand.resolveMappedStatement(MapperMethod.java:254) 位于org.apache.ibatis.binding.MapperMethod$SqlCommand。(MapperMethod.java:224) 位于org.apache.ibatis.binding.MapperMethod.(MapperMethod.java:50) 位于org.apache.ibatis.binding.MapperProxy.lambda$cachedMapperMethod$0(MapperProxy.java:62) 位于java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660) 位于org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.java:62) 位于org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:57) 在com.sun.proxy.$Proxy5.selectMany(未知源) 位于test.TestMyBatisDynamic.main(TestMyBatisDynamic.java:70) 原因:java.lang.IllegalArgumentException:Result Maps集合不包含mappers.SessionMapper.SimpleResults的值 位于org.apache.ibatis.session.Configuration$StrictMap.get(Configuration.java:933) 位于org.apache.ibatis.session.Configuration.getResultMap(Configuration.java:645) 位于org.apache.ibatis.builder.MapperBuilderAssistant.getStatementResultMaps(MapperBuilderAssistant.java:344) ... 还有17个 但当我使用纯注释的结果图时,一切都正常工作。不幸的是,我正试图用集合和关联构建一个更复杂的结果映射,因此使用纯注释似乎不是一个选项


我已尽最大努力尽可能地遵循文档中的示例。我在这里完全不知所措。。。有人知道如何解决这个问题吗?任何帮助或提示都将不胜感激!提前感谢您的时间

多亏了评论中的一篇帖子,我才知道我的代码中存在名称空间冲突。为了解决这个问题,我更改了xml和带注释的映射器,如下所示:

SessionResultMapper.xml


...
因此,在SessionMapper.java中:

@ResultMap(“SessionResultMapper.SimpleResults”)

基本上,确保xml和带注释的映射程序之间的
[namespace].[resultMap id]
路径是一致的。

我认为名称空间应该是映射程序的完全限定类名,所以在xml映射程序中,请执行类似namespace=“package.SessionMapper”的操作,谢谢您的提示@MartinStrejc!我尝试了您的建议,并且已经使用了
namespace=“mappers.SessionMapper”
,但它引发了另一个异常:
org.apache.ibatis.builder.BuilderException:解析SQL映射器配置时出错。原因:org.apache.ibatis.binding.BindingException:Type interface mappers.SessionMapper已为MapperRegistry所知。
似乎无法将xml映射器与带注释的映射器关联起来。是的,很有意义,您可以用xml定义名称空间,例如namespace=“SessionResultMapper”并在java代码中使用该名称空间,例如@ResultMap(“SessionResultMapper.SimpleResults”)@MartinStrejc它工作了!这个名称空间以前让我感到困惑,但多亏了您,我现在对它的工作原理有了更好的理解。非常感谢你的帮助!