解决Caused by: org.apache.ibatis.executor.ExecutorException: A query was run and no Result Maps.....报错

Mybatis报错:查询结果映射缺失的解决
本文解析了Mybatis查询时出现的关于ResultType未定义的错误,提供了错误原因分析和解决方法,包括在配置文件中添加resultType标签的步骤,确保正确返回结果类型。

Mybatis报错日志:

Caused by: org.apache.ibatis.executor.ExecutorException: A query was run and no Result Maps were found for the Mapped Statement 'dao.IUserDao.findOne'.  It's likely that neither a Result Type nor a Result Map was specified.
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.validateResultMapsCount(DefaultResultSetHandler.java:283)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSets(DefaultResultSetHandler.java:189)
	at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:64)
	at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:79)
	at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:63)
	at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:324)
	at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)
	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)
	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:83)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)
	... 27 more

错误分析

根据报错分析可知,报错的大概意思就是没有返回结果集被发现。
大概率就是配置文件有问题,如图为错误的配置文件:
在这里插入图片描述

解决方案

只要在select标签中加上resultType标签,既:resultType=“domain.User”,引号中本人放的是对象地址,这里需要根据个人的查询需求来定,如查询出来是String类型的数据,那么引号中就该是java.long.String,既是返回类型所在的包的名称,其它类型的数据同理。
如图为正确的配置:
在这里插入图片描述
重新运行错误消失,程序没有报错了:
在这里插入图片描述

在使用 MyBatis 将数据保存到 H2 数据库时,如果遇到错误提示 `No setter found for the keyProperty 'id'`,这通常表示 MyBatis 无法找到用于设置主键 `id` 的 setter 方法。解决此问题的关键在于确保实体类、映射文件(或注解)以及数据库表结构之间的一致性。 以下是可能的解决方案: 1. **检查实体类的字段和 setter 方法** 确保实体类中存在一个名为 `id` 的字段,并且该字段具有对应的 setter 方法。例如: ```java public class MyEntity { private Long id; public Long getId() { return id; } public void setId(Long id) { this.id = id; } } ``` 2. **检查 MyBatis 映射文件或注解** 如果使用 XML 映射文件,确保 `<insert>` 语句中使用了 `useGeneratedKeys` 和 `keyProperty` 属性,并且 `keyProperty` 与实体类中的字段名一致。例如: ```xml <insert id="insertEntity" useGeneratedKeys="true" keyProperty="id"> INSERT INTO my_table (name) VALUES (#{name}) </insert> ``` 如果使用注解方式,确保类似以下代码: ```java @Insert("INSERT INTO my_table (name) VALUES (#{name})") @Options(useGeneratedKeys = true, keyProperty = "id") void insertEntity(MyEntity entity); ``` 3. **检查数据库表结构** 确保数据库表中存在 `id` 字段,并且该字段是自增主键(如 `BIGINT AUTO_INCREMENT` 或 `IDENTITY`)。H2 数据库支持自动生成主键值,前提是字段定义正确。 4. **检查字段映射配置** 如果实体类字段名与数据库列名不一致,可以使用 `@Results` 或 `<resultMap>` 明确指定字段与列的映射关系。例如: ```xml <resultMap id="myResultMap" type="MyEntity"> <id property="id" column="id" /> <result property="name" column="name" /> </resultMap> ``` 或者在注解中: ```java @Results(id = "myResultMap", value = { @Result(property = "id", column = "id", id = true), @Result(property = "name", column = "name") }) ``` 5. **确保使用合适的 MyBatis 配置** 如果使用 Spring Boot,确保 `application.properties` 中配置了正确的 MyBatis 行为。例如: ```properties mybatis.configuration.mapUnderscoreToCamelCase=true ``` 此配置可以自动将数据库中的下划线命名(如 `user_id`)映射到实体类的驼峰命名(如 `userId`)。 6. **检查是否使用了正确的表名和 schema** 如果数据库表名或 schema 与映射文件或注解中定义的不一致,可能导致字段无法正确映射。确保使用 `@TableId` 注解(如使用 MyBatis-Plus)或在映射文件中指定正确的表名和 schema。 --- 通过以上步骤,可以有效解决 MyBatis 在保存数据到 H2 数据库时提示 `No setter found for the keyProperty 'id'` 的问题。确保实体类、映射配置和数据库结构之间的一致性是解决此类问题的关键。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xjitcm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值