org.apache.ibatis.builder.IncompleteElementException:找不到结果图。为什么?

问题描述 投票:0回答:1

我无法使用XML文件使用MyBatis和Spring Boot将查询结果映射到Bean。

配置:spring boot,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)application.properties:

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);
    }
 }

请帮助!

java spring spring-boot mybatis
1个回答
0
投票

您没有提到,我认为数据库是MS SQL Server。

一些基本知识。

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

因此,映射器方法可能看起来像这样:

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

并且在结果图中,指定resultSet<collection />属性。我假设第二个结果集用于itemIds

<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>

映射到List<String>有点棘手。我们有一个FAQ entry

这里是可执行文件demo project。为了演示父子关系的映射,它比您的复杂得多。

© www.soinside.com 2019 - 2024. All rights reserved.