MyBatis - 找不到构造函数

时间:2016-08-29 15:09:44

标签: java mybatis

MyBatis映射存在问题。 我有这样的域类:

public class MyClass
{
   private Long id;
   private Date create;
   private String content;

   MyClass (Long id, Date create, String content)
   {
       this.id = id;
       this.create = create;
       this.content = content;
   }

   //getters and setters

使用如下方法的mapper类:

   @Select("SELECT * FROM MyTable WHERE id=#{id}")
   MyClass getMyClass (@Param("id") Long id);

在数据库中,三列的类型为Number,Timestamp和Clob,并且与类字段中的名称相同。

当我使用这种方法时,我得到一个: ExecutorException:在[MyClass中找不到构造函数;匹配[java.math.BigDecimal,java.sql.Timestamp,oracle.jdbc.OracleClob]

如果我从Myclass中删除构造函数,那么就没有任何问题。我想有构造函数,我该如何修复它? 我尝试在mapper中添加@Results注释,但它没有任何区别:

   @Results(value = {
      @Result(column = "id", property = "id", javaType = Long.class),
      @Result(column = "create", property = "create", javaType = Date.class),
      @Result(column = "content", property = "content", javaType = String.class)
   })

4 个答案:

答案 0 :(得分:20)

MyBatis期望您的模型对象具有无参数构造函数(并且可能是每个映射字段的setter)。添加这些,一切都应该有效。

答案 1 :(得分:2)

您可以使用@ConstructorArgs,如下所示:

@ConstructorArgs({
    @Arg(column = "id", javaType = Long.class)
    ,@Arg(column = "create", javaType = Date.class)
    ,@Arg(column = "content", javaType = String.class)
})

答案 2 :(得分:0)

只需完成@Kazuki Shimizu的答案即可。

如果要在构造函数中使用基本类型long而不是包装器Long,则需要将绑定更改为:

@ConstructorArgs({
   @Arg(column = "id", javaType = long.class)
   ,@Arg(column = "create", javaType = Date.class)
   ,@Arg(column = "content", javaType = String.class)
})

答案 3 :(得分:0)

请注意,您需要在构造函数中添加 mybatis @Param 注解,以防您想使用 @ConstructorArgs。所以你的构造函数看起来像:

public class MyClass
{
   private long id;
   private Date create;
   private String content;

   MyClass (@Param("id") long id, @Param("create") Date create, @Param("content") String content)
   {
       this.id = id;
       this.create = create;
       this.content = content;
   }

然后是您的映射器:

@ConstructorArgs({
   @Arg(name = "id", column = "id", javaType = long.class),
   @Arg(name = "create", column = "create", javaType = Date.class),
   @Arg(name = "content", column = "content", javaType = String.class)
})