Mybatis 报错:java.lang.NoSuchMethodException: java.lang.Long.<init>()

来源:互联网 发布:英伟达优化软件 编辑:程序博客网 时间:2024/06/05 04:53

用户找角色时, 用户mapper中使用association 关联角色mapper 中的查询.

 用户代码

package mybatis.simple.model;import java.io.Serializable;import java.util.Date;public class SysUser   implements Serializable {    private static final long serialVersionUID = -7811230963635946774L;    private Long id;    private String userName;    private String userPassword;    private String userEmail;    private String userInfo;    private Date createTime;    private byte[] headImg;    private SysRole sysRole;        public Long getId() {        return id;    }    public void setId(Long id) {        this.id = id;    }        public String getUserName() {        return userName;    }    public void setUserName(String userName) {        this.userName = userName;    }    public String getUserPassword() {        return userPassword;    }    public void setUserPassword(String userPassword) {        this.userPassword = userPassword;    }    public String getUserEmail() {        return userEmail;    }    public void setUserEmail(String userEmail) {        this.userEmail = userEmail;    }    public String getUserInfo() {        return userInfo;    }    public void setUserInfo(String userInfo) {        this.userInfo = userInfo;    }        public Date getCreateTime() {        return createTime;    }    public void setCreateTime(Date createTime) {        this.createTime = createTime;    }    public byte[] getHeadImg() {        return headImg;    }    public void setHeadImg(byte[] headImg) {        this.headImg = headImg;    }    public SysRole getSysRole() {        return sysRole;    }    public void setSysRole(SysRole sysRole) {        this.sysRole = sysRole;    }}
用户接口配置:

package mybatis.simple.mapper;import tk.mybatis.simple.model.SysUser;public interface SysUserMapper {    SysUser selectUserAndRoleByPrimaryKey02(Long id);}
用户mapper.xml 配置

<resultMap id="userWithRole02" type="tk.mybatis.simple.model.SysUser">    <association property="sysRole" column="{id=role_id}" select="tk.mybatis.simple.mapper.SysRoleMapper.selectByPrimaryKey"/>  </resultMap>  <select id="selectUserAndRoleByPrimaryKey02" resultMap="userWithRole02">    select u.* , ur.role_id    from sys_user u    inner join sys_user_role ur on ur.user_id=u.id    where u.id=#{id}  </select>


角色mapper.xml 配置

  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">    select     <include refid="Base_Column_List" />    from sys_role    where id = #{id,jdbcType=BIGINT}  </select>

测试代码

import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.junit.BeforeClass;import org.junit.Test;import tk.mybatis.simple.model.SysUser;import java.io.IOException;import java.io.Reader;import java.util.Date;import java.util.List;public class SysUserTest extends BaseTest {        private static SqlSessionFactory sqlSessionFactory;    @BeforeClass    public static void buildSqlSessionFactory() {        try {            Reader reader = Resources.getResourceAsReader("mybatis-config.xml");            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);        } catch (IOException e) {            e.printStackTrace();        }    }    public SqlSession getSqlSession() {        return sqlSessionFactory.openSession();    }    @Test    public void testselectUserAndRoleByPrimaryKey02(){        SqlSession sqlSession = getSqlSession();        try{            SysUserMapper mapper = sqlSession.getMapper(SysUserMapper.class);            SysUser sysUser = mapper.selectUserAndRoleByPrimaryKey02(1L);            System.out.println(sysUser);        } finally {            sqlSession.close();        }    }}
测试后报错为:

DEBUG [main] - ==>  Preparing: select u.* , ur.role_id from sys_user u inner join sys_user_role ur on ur.user_id=u.id where u.id=? 
DEBUG [main] - ==> Parameters: 1(Long)
TRACE [main] - <==    Columns: id, user_name, user_password, user_email, user_info, head_img, create_time, role_id
TRACE [main] - <==        Row: 1, admin, 123456, admin@mybatis.chengkai, 管理员, <<BLOB>>, 2017-07-29 22:02:32.0, 1


org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: org.apache.ibatis.reflection.ReflectionException: Error instantiating class java.lang.Long with invalid types () or values (). Cause: java.lang.NoSuchMethodException: java.lang.Long.<init>()
### The error may exist in tk/mybatis/simple/mapper/SysUserMapper.xml
### The error may involve tk.mybatis.simple.mapper.SysUserMapper.selectUserAndRoleByPrimaryKey02
### The error occurred while handling results
### SQL: select u.* , ur.role_id     from sys_user u     inner join sys_user_role ur on ur.user_id=u.id     where u.id=?
### Cause: org.apache.ibatis.reflection.ReflectionException: Error instantiating class java.lang.Long with invalid types () or values (). Cause: java.lang.NoSuchMethodException: java.lang.Long.<init>()


at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:122)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:113)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:73)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:69)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:53)
at com.sun.proxy.$Proxy5.selectUserAndRoleByPrimaryKey02(Unknown Source)
at mybatis.simple.mapper.SysUserTest.testselectUserAndRoleByPrimaryKey02(SysUserTest.java:27)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Caused by: org.apache.ibatis.reflection.ReflectionException: Error instantiating class java.lang.Long with invalid types () or values (). Cause: java.lang.NoSuchMethodException: java.lang.Long.<init>()
at org.apache.ibatis.reflection.factory.DefaultObjectFactory.instantiateClass(DefaultObjectFactory.java:90)
at org.apache.ibatis.reflection.factory.DefaultObjectFactory.create(DefaultObjectFactory.java:50)
at org.apache.ibatis.reflection.factory.DefaultObjectFactory.create(DefaultObjectFactory.java:42)
at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.instantiateParameterObject(DefaultResultSetHandler.java:696)
at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.prepareCompositeKeyParameter(DefaultResultSetHandler.java:676)
at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.prepareParameterForNestedQuery(DefaultResultSetHandler.java:659)
at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.getNestedQueryMappingValue(DefaultResultSetHandler.java:635)
at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.getPropertyMappingValue(DefaultResultSetHandler.java:404)
at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.applyPropertyMappings(DefaultResultSetHandler.java:384)
at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.getRowValue(DefaultResultSetHandler.java:346)
at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValuesForSimpleResultMap(DefaultResultSetHandler.java:298)
at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValues(DefaultResultSetHandler.java:273)
at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSet(DefaultResultSetHandler.java:246)
at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSets(DefaultResultSetHandler.java:160)
at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:63)
at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:78)
at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:62)
at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:303)
at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:154)
at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:102)
at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:82)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:120)
... 29 more
Caused by: java.lang.NoSuchMethodException: java.lang.Long.<init>()
at java.lang.Class.getConstructor0(Class.java:3082)
at java.lang.Class.getDeclaredConstructor(Class.java:2178)
at org.apache.ibatis.reflection.factory.DefaultObjectFactory.instantiateClass(DefaultObjectFactory.java:62)
... 50 more


后将角色mapper.xml  id="selectByPrimaryKey" 中parameterType 去掉后执行成功. 
应该是因为配置了ParameterType 后Mybatis 会自动创建对象并且设置参数. 但java.lang.Long 没有空参数的构造函数报错. 去掉parameterType 后, Mybatis 会自动进行类型匹配.




阅读全文
0 0
原创粉丝点击