# java.lang.IllegalAccessException: Can not set final java.lang.Long field com.example.module1.model.User.id to java.lang.Long
JDK新特性中,record类的引入可以让我们更方便的定义 model 类,原本冗杂的定义,现在只需要简单的几行代码
- User实体类
package com.example.module1.model; import java.io.Serializable; public record User( Long id, String username, String password, String nickname )implements Serializable {}
但是这里不是主要讲 record 的使用,而是讲由于 record类中的属性都是用 final关键字修饰,在使用mybatis查询数据库,并返回实例化对象时出现的一个异常:java.lang.IllegalAccessException: Can not set final java.lang.Long field com.example.module1.model.User.id to java.lang.Long
- mapper.xml
<select id="selectByUsernameAndPassword" resultType="com.example.module1.model.User"> select id, username, password, nickname from user where username = #{username} and password = #{password} </select>
此时的解决办法就是搬出mybatis中最重要最强大的元素 resultMap(不了解的可以观看[mybatis中文文档](https://mybatis.net.cn/sqlmap-xml.html#select)),使用resultmap 做constructor,这样就能解决这个问题
- mapper.xml
<resultMap id="userType" type="com.example.module1.model.User"> <constructor> <idArg column="id" javaType="java.lang.Long"/> <arg column="username" javaType="java.lang.String"/> <arg column="password" javaType="java.lang.String"/> <arg column="nickname" javaType="java.lang.String"/> </constructor> </resultMap> <select id="selectByUsernameAndPassword" resultMap="userType"> select id, username, password, nickname from user where username = #{username} and password = #{password} </select>