mybaits 错误
<resultMap id="roleMap" type="Role">
<id column="role_id" property="roleId"></id>
<result column="role_name" property="roleName"></result>
<result column="remark" property="remark"></result>
<!-- <result column="dept_id" property="deptId"></result>-->
<result column="create" property="create"></result>
<collection property="users" javaType="user">
<id column="user_d" property="userId"></id>
<result column="username" property="username"></result>
<result column="password" property="password"></result>
<result column="salt" property="salt"></result>
<result column="email" property="email"></result>
<result column="mobile" property="mobile"></result>
<result column="status" property="status"></result>
<result column="dept_id" property="deptId"></result>
<result column="create_time" property="createTime"></result>
</collection>
</resultMap>
这是我之前的mapper.xml文件 ,报错如下
2020-05-08 19:54:04,122 [main] DEBUG [com.ujiuye.mapper.UserMapper.selectUserById] - ==> Preparing: SELECT u.user_id,u.username,u.email,u.mobile, r.role_id,r.role_name FROM sys_user u INNER JOIN sys_user_role ur ON u.user_id=ur.user_id INNER JOIN sys_role r ON ur.role_id=r.role_id WHERE u.user_id=?
2020-05-08 19:54:04,147 [main] DEBUG [com.ujiuye.mapper.UserMapper.selectUserById] - ==> Parameters: 1(Long)
org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: org.apache.ibatis.reflection.ReflectionException: Could not set property 'roles' of 'class com.ujiuye.entity.User' with value 'Role(roleId=1, roleName=超级管理员, remark=null, deptId=null, createTime=null, users=null)' Cause: java.lang.IllegalArgumentException: argument type mismatch
### The error may exist in com/ujiuye/mapper/UserMapper.xml
### The error may involve com.ujiuye.mapper.UserMapper.selectUserById
### The error occurred while handling results
### SQL: SELECT u.user_id,u.username,u.email,u.mobile, r.role_id,r.role_name FROM sys_user u INNER JOIN sys_user_role ur ON u.user_id=ur.user_id INNER JOIN sys_role r ON ur.role_id=r.role_id WHERE u.user_id=?
### Cause: org.apache.ibatis.reflection.ReflectionException: Could not set property 'roles' of 'class com.ujiuye.entity.User' with value 'Role(roleId=1, roleName=超级管理员, remark=null, deptId=null, createTime=null, users=null)' Cause: java.lang.IllegalArgumentException: argument type mismatch
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:149)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:76)
... 49 more
Process finished with exit code -1
改正后:
<resultMap id="userRoles" type="User">
<id column="user_id" property="userId"></id>
<result column="username" property="username"></result>
<result column="password" property="password"></result>
<result column="salt" property="salt"/>
<collection property="roles" ofType="Role">
<id column="role_id" property="roleId"/>
<result column="role_name" property="roleName"/>
</collection>
</resultMap>
注意: 我改正的是 collection 标签中的 javaType 改为了 ofType
javaType属性的问题,因为这个是一对多,通过反射应该映射为List,但是使用javaType会让MyBatis认为roles属性为单个对象,所以出错,将javaType改为ofType,只是指定泛型的类型为role。