調用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>
:BaseResultMap
和ResultMapWithBLOBs
)。 -
且其創建的JavaBean中只有無參和全參兩種構造器,所以要注意自行添加不帶長文本字段的構造器。