Mybatis查询数据库有返回,但实体类输出null

今天遇到了一个很坑的问题,测试的时候,显示返回了一条数据,但输出却是null,一开始以为是实体类中字段的名称和数据库字段的名称不对应
这里写图片描述

    // 用户id
	private String user_id;
	// 用户名
	private String user_name;
	// 密码
	private String user_password;
	// 盐值
	private String user_salt;
	// 账户过期时间
	private Date user_account_deadline;
	// 账户的积分
	private Integer user_integration;
	// 账户剩余下载次数
	private Integer user_downloadtimes;

对比发现一摸一样。坑就坑在这里。我重新写了一个表进行测试,字段名没有使用这种下划线形式的,测试发现可以取到数据。困扰了很久,后来我看了看我mybatis的配置文件,有这么一个配置

<!-- 开启驼峰命名法 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>

一拍大腿,应该就是这个问题了,把该配置注释掉,查询正常。

开启驼峰命名,把数据库中表字段的下划线去掉,自动使用驼峰命名,所以实体类中的字段名和表的字段名完全不一致,导致无法查出数据。自己坑了自己一波。

关注微信公众号:秃头哥编程(ID:xp_1311664842),领取编程大礼包。

在这里插入图片描述

在使用 MyBatis 查询数据库时,若尝试用实体类接收返回字段却遇到类型转换错误,错误信息为 `java.util.HashMap cannot be cast`,这通常是由于 MyBatis 没有正确地将查询结果映射到指定的实体类,而是默认以 `HashMap` 的形式返回了结果。 ### 原因分析 1. **resultType 类型设置错误** 在 MyBatis 的 `<select>` 标签中,如果返回的是一个实体类对象的集合,`resultType` 属性应指定为该实体类的全限定类名,而不是 `java.util.Map` 或 `java.util.HashMap`。如果错误地将 `resultType` 设置为 `"map"`,MyBatis返回 `HashMap` 类型的对象,当尝试将其转换为实体类时,就会抛出 `java.util.HashMap cannot be cast` 异常 [^1]。 2. **MyBatis 映射配置不正确** 如果没有定义 `<resultMap>` 或者字段名与实体类属性名不匹配,MyBatis 无法正确地将数据库字段映射到实体类属性,也会导致结果以 `HashMap` 形式返回,从而引发类型转换错误 [^1]。 3. **使用 PageHelper 分页插件时的误用** 在某些情况下,特别是在使用 PageHelper 插件进行分页查询时,如果分页逻辑放置不当,也可能导致查询结果未能正确映射为实体类对象,而是以 `ArrayList` 或 `LinkedHashMap` 的形式返回,从而引发类似的类型转换异常 [^3]。 ### 解决方案 1. **修改 `resultType` 为实体类类型** 确保 `<select>` 标签中的 `resultType` 属性值是实体类的全限定类名,而非集合类型或 Map 类型。例如: ```xml <select id="getEmpsByLastNameLike" resultType="com.bean.Employee"> SELECT * FROM tbl_employee WHERE last_name LIKE #{lastname} </select> ``` 2. **使用 `<resultMap>` 明确字段映射** 如果字段名与实体类属性名不一致,可以定义 `<resultMap>` 来指定映射关系,确保 MyBatis 正确地将查询结果映射到实体类: ```xml <resultMap id="employeeResultMap" type="com.bean.Employee"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="lastName" column="last_name"/> </resultMap> <select id="getEmpsByLastNameLike" resultMap="employeeResultMap"> SELECT * FROM tbl_employee WHERE last_name LIKE #{lastname} </select> ``` 3. **检查 PageHelper 使用方式** 如果使用了 PageHelper 插件进行分页查询,确保分页逻辑在 Service 层处理,并且分页插件应在最后一次查询前应用,以避免因多次查询导致的结果类型错误 [^3]。 4. **确保返回类型一致性** 如果使用了 REST 调用(如 `RestTemplate`)获取数据并期望返回实体类集合,应使用泛型方式获取结果,例如通过 `ParameterizedTypeReference` 来确保类型正确: ```java ResponseEntity<List<EmployeeModel>> response = restTemplate.exchange( "http://SPRINGCLOUD-EMPLOYEE-PROVIDER/emp/list", HttpMethod.GET, null, new ParameterizedTypeReference<List<EmployeeModel>>() {} ); List<EmployeeModel> employeeModels = response.getBody(); ``` ###
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值