bug fixed: 有种情况下ModelBaseRecordClass不会生成不包含BLOBs的构造方法,造成selectOneByExample返回结果找不到对应的构造方法异常
This commit is contained in:
@@ -19,6 +19,7 @@ package com.itfsw.mybatis.generator.plugins;
|
||||
import com.itfsw.mybatis.generator.plugins.utils.BasePlugin;
|
||||
import com.itfsw.mybatis.generator.plugins.utils.JavaElementGeneratorTools;
|
||||
import com.itfsw.mybatis.generator.plugins.utils.XmlElementGeneratorTools;
|
||||
import org.mybatis.generator.api.IntrospectedColumn;
|
||||
import org.mybatis.generator.api.IntrospectedTable;
|
||||
import org.mybatis.generator.api.dom.java.*;
|
||||
import org.mybatis.generator.api.dom.xml.Attribute;
|
||||
@@ -26,6 +27,9 @@ import org.mybatis.generator.api.dom.xml.Document;
|
||||
import org.mybatis.generator.api.dom.xml.TextElement;
|
||||
import org.mybatis.generator.api.dom.xml.XmlElement;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import static org.mybatis.generator.internal.util.StringUtility.stringHasValue;
|
||||
|
||||
/**
|
||||
@@ -40,10 +44,77 @@ public class SelectOneByExamplePlugin extends BasePlugin {
|
||||
public static final String METHOD_SELECT_ONE_BY_EXAMPLE = "selectOneByExample"; // 方法名
|
||||
public static final String METHOD_SELECT_ONE_BY_EXAMPLE_WITH_BLOBS = "selectOneByExampleWithBLOBs"; // 方法名
|
||||
|
||||
@Override
|
||||
public boolean modelBaseRecordClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
|
||||
|
||||
// 有种情况下ModelBaseRecordClass不会生成不包含BLOBs的构造方法,造成selectOneByExample返回结果找不到对应的构造方法异常
|
||||
if (introspectedTable.hasBLOBColumns() && !introspectedTable.getRules().generateRecordWithBLOBsClass()) {
|
||||
// 添加没有BLOBs的构造方法
|
||||
Method method = new Method();
|
||||
method.setVisibility(JavaVisibility.PUBLIC);
|
||||
method.setConstructor(true);
|
||||
method.setName(topLevelClass.getType().getShortName());
|
||||
commentGenerator.addGeneralMethodComment(method, introspectedTable);
|
||||
|
||||
// 使用没有blobs的字段
|
||||
List<IntrospectedColumn> constructorColumns = introspectedTable.getNonBLOBColumns();
|
||||
|
||||
for (IntrospectedColumn introspectedColumn : constructorColumns) {
|
||||
method.addParameter(new Parameter(introspectedColumn.getFullyQualifiedJavaType(), introspectedColumn.getJavaProperty()));
|
||||
topLevelClass.addImportedType(introspectedColumn.getFullyQualifiedJavaType());
|
||||
}
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
if (introspectedTable.getRules().generatePrimaryKeyClass()) {
|
||||
boolean comma = false;
|
||||
sb.append("super(");
|
||||
for (IntrospectedColumn introspectedColumn : introspectedTable.getPrimaryKeyColumns()) {
|
||||
if (comma) {
|
||||
sb.append(", ");
|
||||
} else {
|
||||
comma = true;
|
||||
}
|
||||
sb.append(introspectedColumn.getJavaProperty());
|
||||
}
|
||||
sb.append(");");
|
||||
method.addBodyLine(sb.toString());
|
||||
}
|
||||
|
||||
List<IntrospectedColumn> introspectedColumns;
|
||||
if (!introspectedTable.getRules().generatePrimaryKeyClass() && introspectedTable.hasPrimaryKeyColumns()) {
|
||||
introspectedColumns = introspectedTable.getNonBLOBColumns();
|
||||
} else {
|
||||
introspectedColumns = introspectedTable.getBaseColumns();
|
||||
}
|
||||
|
||||
for (IntrospectedColumn introspectedColumn : introspectedColumns) {
|
||||
sb.setLength(0);
|
||||
sb.append("this.");
|
||||
sb.append(introspectedColumn.getJavaProperty());
|
||||
sb.append(" = ");
|
||||
sb.append(introspectedColumn.getJavaProperty());
|
||||
sb.append(';');
|
||||
method.addBodyLine(sb.toString());
|
||||
}
|
||||
|
||||
// 找到原有构造方法位置,保持构造方法放在一起美观
|
||||
ArrayList<Method> methods = (ArrayList<Method>) topLevelClass.getMethods();
|
||||
int index = 0;
|
||||
for (Method m : methods) {
|
||||
index++;
|
||||
if (m.getName().equals(topLevelClass.getType().getShortName())) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
methods.add(index, method);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Java Client Methods 生成
|
||||
* 具体执行顺序 http://www.mybatis.org/generator/reference/pluggingIn.html
|
||||
*
|
||||
* @param interfaze
|
||||
* @param topLevelClass
|
||||
* @param introspectedTable
|
||||
@@ -62,10 +133,10 @@ public class SelectOneByExamplePlugin extends BasePlugin {
|
||||
|
||||
// interface 增加方法
|
||||
interfaze.addMethod(method);
|
||||
logger.debug("itfsw(查询单条数据插件):"+interfaze.getType().getShortName()+"增加selectOneByExample方法。");
|
||||
logger.debug("itfsw(查询单条数据插件):" + interfaze.getType().getShortName() + "增加selectOneByExample方法。");
|
||||
|
||||
// 方法生成 selectOneByExampleWithBLOBs !!! 注意这里的行为不以有没有生成Model 的 WithBLOBs类为基准
|
||||
if (introspectedTable.hasBLOBColumns()){
|
||||
if (introspectedTable.hasBLOBColumns()) {
|
||||
// 方法生成 selectOneByExample
|
||||
Method method1 = JavaElementGeneratorTools.generateMethod(
|
||||
METHOD_SELECT_ONE_BY_EXAMPLE_WITH_BLOBS,
|
||||
@@ -77,7 +148,7 @@ public class SelectOneByExamplePlugin extends BasePlugin {
|
||||
|
||||
// interface 增加方法
|
||||
interfaze.addMethod(method1);
|
||||
logger.debug("itfsw(查询单条数据插件):"+interfaze.getType().getShortName()+"增加selectOneByExampleWithBLOBs方法。");
|
||||
logger.debug("itfsw(查询单条数据插件):" + interfaze.getType().getShortName() + "增加selectOneByExampleWithBLOBs方法。");
|
||||
}
|
||||
|
||||
return true;
|
||||
@@ -86,7 +157,6 @@ public class SelectOneByExamplePlugin extends BasePlugin {
|
||||
/**
|
||||
* SQL Map Methods 生成
|
||||
* 具体执行顺序 http://www.mybatis.org/generator/reference/pluggingIn.html
|
||||
*
|
||||
* @param document
|
||||
* @param introspectedTable
|
||||
* @return
|
||||
@@ -105,37 +175,37 @@ public class SelectOneByExamplePlugin extends BasePlugin {
|
||||
selectOneElement.addAttribute(new Attribute("resultMap", introspectedTable.getBaseResultMapId()));
|
||||
// 添加参数类型
|
||||
selectOneElement.addAttribute(new Attribute("parameterType", introspectedTable.getExampleType()));
|
||||
selectOneElement.addElement(new TextElement("select")); //$NON-NLS-1$
|
||||
selectOneElement.addElement(new TextElement("select"));
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
if (stringHasValue(introspectedTable.getSelectByExampleQueryId())) {
|
||||
sb.append('\'');
|
||||
sb.append(introspectedTable.getSelectByExampleQueryId());
|
||||
sb.append("' as QUERYID,"); //$NON-NLS-1$
|
||||
sb.append("' as QUERYID,");
|
||||
selectOneElement.addElement(new TextElement(sb.toString()));
|
||||
}
|
||||
selectOneElement.addElement(XmlElementGeneratorTools.getBaseColumnListElement(introspectedTable));
|
||||
|
||||
sb.setLength(0);
|
||||
sb.append("from "); //$NON-NLS-1$
|
||||
sb.append("from ");
|
||||
sb.append(introspectedTable.getAliasedFullyQualifiedTableNameAtRuntime());
|
||||
selectOneElement.addElement(new TextElement(sb.toString()));
|
||||
selectOneElement.addElement(XmlElementGeneratorTools.getExampleIncludeElement(introspectedTable));
|
||||
|
||||
XmlElement ifElement = new XmlElement("if"); //$NON-NLS-1$
|
||||
ifElement.addAttribute(new Attribute("test", "orderByClause != null")); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
ifElement.addElement(new TextElement("order by ${orderByClause}")); //$NON-NLS-1$
|
||||
XmlElement ifElement = new XmlElement("if");
|
||||
ifElement.addAttribute(new Attribute("test", "orderByClause != null")); //$NON-NLS-2$
|
||||
ifElement.addElement(new TextElement("order by ${orderByClause}"));
|
||||
selectOneElement.addElement(ifElement);
|
||||
|
||||
// 只查询一条
|
||||
selectOneElement.addElement(new TextElement("limit 1"));
|
||||
// 添加到根节点
|
||||
document.getRootElement().addElement(selectOneElement);
|
||||
logger.debug("itfsw(查询单条数据插件):"+introspectedTable.getMyBatis3XmlMapperFileName()+"增加selectOneByExample方法。");
|
||||
logger.debug("itfsw(查询单条数据插件):" + introspectedTable.getMyBatis3XmlMapperFileName() + "增加selectOneByExample方法。");
|
||||
|
||||
// ------------------------------------ selectOneByExampleWithBLOBs ----------------------------------
|
||||
// !!! 注意这里的行为不以有没有生成Model 的 WithBLOBs类为基准
|
||||
if (introspectedTable.hasBLOBColumns()){
|
||||
if (introspectedTable.hasBLOBColumns()) {
|
||||
// 生成查询语句
|
||||
XmlElement selectOneWithBLOBsElement = new XmlElement("select");
|
||||
// 添加注释(!!!必须添加注释,overwrite覆盖生成时,@see XmlFileMergerJaxp.isGeneratedNode会去判断注释中是否存在OLD_ELEMENT_TAGS中的一点,例子:@mbg.generated)
|
||||
@@ -148,13 +218,13 @@ public class SelectOneByExamplePlugin extends BasePlugin {
|
||||
// 添加参数类型
|
||||
selectOneWithBLOBsElement.addAttribute(new Attribute("parameterType", introspectedTable.getExampleType()));
|
||||
// 添加查询SQL
|
||||
selectOneWithBLOBsElement.addElement(new TextElement("select")); //$NON-NLS-1$
|
||||
selectOneWithBLOBsElement.addElement(new TextElement("select"));
|
||||
|
||||
sb.setLength(0);
|
||||
if (stringHasValue(introspectedTable.getSelectByExampleQueryId())) {
|
||||
sb.append('\'');
|
||||
sb.append(introspectedTable.getSelectByExampleQueryId());
|
||||
sb.append("' as QUERYID,"); //$NON-NLS-1$
|
||||
sb.append("' as QUERYID,");
|
||||
selectOneWithBLOBsElement.addElement(new TextElement(sb.toString()));
|
||||
}
|
||||
|
||||
@@ -163,14 +233,14 @@ public class SelectOneByExamplePlugin extends BasePlugin {
|
||||
selectOneWithBLOBsElement.addElement(XmlElementGeneratorTools.getBlobColumnListElement(introspectedTable));
|
||||
|
||||
sb.setLength(0);
|
||||
sb.append("from "); //$NON-NLS-1$
|
||||
sb.append("from ");
|
||||
sb.append(introspectedTable.getAliasedFullyQualifiedTableNameAtRuntime());
|
||||
selectOneWithBLOBsElement.addElement(new TextElement(sb.toString()));
|
||||
selectOneWithBLOBsElement.addElement(XmlElementGeneratorTools.getExampleIncludeElement(introspectedTable));
|
||||
|
||||
XmlElement ifElement1 = new XmlElement("if"); //$NON-NLS-1$
|
||||
ifElement1.addAttribute(new Attribute("test", "orderByClause != null")); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
ifElement1.addElement(new TextElement("order by ${orderByClause}")); //$NON-NLS-1$
|
||||
XmlElement ifElement1 = new XmlElement("if");
|
||||
ifElement1.addAttribute(new Attribute("test", "orderByClause != null")); //$NON-NLS-2$
|
||||
ifElement1.addElement(new TextElement("order by ${orderByClause}"));
|
||||
selectOneWithBLOBsElement.addElement(ifElement1);
|
||||
|
||||
// 只查询一条
|
||||
@@ -178,7 +248,7 @@ public class SelectOneByExamplePlugin extends BasePlugin {
|
||||
|
||||
// 添加到根节点
|
||||
document.getRootElement().addElement(selectOneWithBLOBsElement);
|
||||
logger.debug("itfsw(查询单条数据插件):"+introspectedTable.getMyBatis3XmlMapperFileName()+"增加selectOneByExampleWithBLOBs方法。");
|
||||
logger.debug("itfsw(查询单条数据插件):" + introspectedTable.getMyBatis3XmlMapperFileName() + "增加selectOneByExampleWithBLOBs方法。");
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user