Mybatis逆向工程所生成的mapper接口时出现错误

调用mybatis的mapper接口中的selectByExample()方法抛出异常:java.lang.NoSuchMethodException: com…Xxx.<init>(...)

搜索网上解决方法大都是在JavaBean中添加无参构造器。但这里并不是缺乏无参构造器。。项目中的mapper.xml、dao接口以及表对应的实体类都是使用Mybatis逆向工程生成,逆向工程生成的JavaBean都有无参构造器。

但报错的原因还是一样:Mybatis在封装结果时,找不到对应JavaBean的指定构造器

最终找到的原因是:

数据表中带有一个text类型的字段(Mysql),mybatis逆向工程针对有长文本字段的表,生成的mapper接口中的select方法有两种类型

List<Bean> selectByExampleWithBLOBs(BeanExample example);
List<Bean> selectByExample(BeanExample example);
复制代码

即第一个方法返回的数据中会有长文本字段对应的属性值。而第二个不包括长文本。

而我调用的是selectByExample()方法,这时mybatis在封装Bean时会使用反射调用Bean中没有长文本字段的构造器,而逆向工程生成的Bean中只有无参跟全参(包含全部成员变量)两个构造器,所以会抛出上述异常。

解决方法

  • 要使用带有长文本字段的JavaBean时,调用selectByExampleWithBLOBs()方法。
  • 使用selectByExample()方法时,注意在对应JavaBean中添加不包含长文本成员变量的构造器。

小结:

  • 若是数据表中带有长文本字段,在使用Mybatis逆向工程生成的类时要注意mapper方法的select方法有两种类型:返回的JavaBean带长文本字段和不带的(到对应的mapper.xml文件中可以看到封装了两种<resultMap>BaseResultMapResultMapWithBLOBs)。

  • 且其创建的JavaBean中只有无参和全参两种构造器,所以要注意自行添加不带长文本字段的构造器。


作者:bxxiao
链接:https://juejin.im/post/6894194531965763598
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

posted @ 2020-11-13 15:17  人生的激活码  阅读(358)  评论(0编辑  收藏  举报