当前位置: 首页 > 知识库问答 >
问题:

组织。阿帕奇。伊巴蒂斯。建设者UncompleteElementException:找不到结果映射。为什么?

陶星辰
2023-03-14

我无法使用xml文件将查询结果映射到带有MyBatis和Spring Boot的bean。

配置:Spring启动,mybatis。

1) 我有一个制图器:

package ru.kq.cn.mapper;

@Mapper
public interface GateMapper {



    @Select("call [dbo].[cai_Select] 1, ")
    @ResultMap("GateMapper.WResultMap")
    WQueryResult call();
}

2)在同一个包中,我有用于ResultSet的xml:

 <mapper namespace="ru.kq.cn.mapper.GateMapper">
    <resultMap id="WResultMap" type="ru.kq.cn.dto.WQueryResult">
        <result property="proverTpId" column="proverTpId"/>
        <collection property="itemIds" column="itemId">
        </collection>
    </resultMap>
 </mapper>

3) DTO:

package ru.kq.cn.dto;
 ..

@Data

public class WQueryResult implements Serializable {
    Long proverTpId;
    List <String>  itemIds;
}

3) 申请。属性:

mybatis.type-aliases-package=ru.kq.cn.dto
mybatis.mapper-locations='classpath:ru/kq/cn/mapper/*.xml'

4)应用程序:

 @MapperScan("ru.kq.cn.mapper")
@SpringBootApplication
public class  Application   {
 public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
 }

请帮忙!

共有1个答案

周和安
2023-03-14

正如你没有提到的,我假设DB是MSSQLServer。

一些基本知识。

  • 要调用存储过程,需要设置statementType=“CALLABLE”
  • 在JDBC中,调用存储过程的语法是{call proc(?,,…)}
  • 要处理多个结果集,需要使用语句的resultSets来命名每个结果集

因此,mapper方法可能看起来像这样:

java prettyprint-override">@Select("{call [dbo].[cai_Select](1)}")
@ResultMap("WResultMap")
@Options(
    statementType = StatementType.CALLABLE,
    resultSets = "firstRS,secondRS">
WQueryResult call();

您的过程返回两个结果集。我分别将它们命名为firstRS2nd dRS

在结果映射中,指定

<resultMap id="WResultMap" type="ru.kq.cn.dto.WQueryResult">
  <result property="proverTpId" column="proverTpId"/>
  <collection property="itemIds" ofType="java.lang.String"
      javaType="java.util.ArrayList" resultSet="secondRS">
    <id column="itemId">
  </collection>
</resultMap>

映射到列表

这是一个可执行的演示项目。
为了演示父子关系的映射,它比你的更复杂。

 类似资料: