Merge remote-tracking branch 'origin/main'

# Conflicts:
#	mybatis-flex-core/src/main/java/com/mybatisflex/core/constant/SqlConsts.java
This commit is contained in:
Suomm 2023-06-14 09:25:52 +08:00
commit 64cd2d3781
11 changed files with 81 additions and 77 deletions

View File

@ -28,7 +28,6 @@ public final class SqlConsts {
} }
// === 常用符号 === // === 常用符号 ===
public static final String EMPTY = ""; public static final String EMPTY = "";
public static final String BLANK = " "; public static final String BLANK = " ";
public static final String ASTERISK = "*"; public static final String ASTERISK = "*";
@ -38,14 +37,13 @@ public final class SqlConsts {
public static final String PLACEHOLDER = "?"; public static final String PLACEHOLDER = "?";
public static final String PERCENT_SIGN = "%"; public static final String PERCENT_SIGN = "%";
public static final String SINGLE_QUOTE = "'"; public static final String SINGLE_QUOTE = "'";
public static final String LEFT_BRACKET = "("; public static final String BRACKET_LEFT = "(";
public static final String RIGHT_BRACKET = ")"; public static final String BRACKET_RIGHT = ")";
// === SQL 关键字 ===
public static final String HINT_START = "/*+ "; public static final String HINT_START = "/*+ ";
public static final String HINT_END = " */ "; public static final String HINT_END = " */ ";
// === SQL 关键字 ===
public static final String AS = " AS "; public static final String AS = " AS ";
public static final String OR = " OR "; public static final String OR = " OR ";
public static final String END = " END"; public static final String END = " END";
@ -56,9 +54,7 @@ public final class SqlConsts {
public static final String THEN = " THEN "; public static final String THEN = " THEN ";
public static final String ELSE = " ELSE "; public static final String ELSE = " ELSE ";
public static final String FROM = " FROM "; public static final String FROM = " FROM ";
public static final String INTO = " INTO ";
public static final String WHERE = " WHERE "; public static final String WHERE = " WHERE ";
public static final String INSERT = "INSERT";
public static final String SELECT = "SELECT "; public static final String SELECT = "SELECT ";
public static final String VALUES = " VALUES "; public static final String VALUES = " VALUES ";
public static final String DELETE = "DELETE"; public static final String DELETE = "DELETE";
@ -67,15 +63,19 @@ public final class SqlConsts {
public static final String DISTINCT = "DISTINCT "; public static final String DISTINCT = "DISTINCT ";
public static final String GROUP_BY = " GROUP BY "; public static final String GROUP_BY = " GROUP BY ";
public static final String ORDER_BY = " ORDER BY "; public static final String ORDER_BY = " ORDER BY ";
public static final String INSERT = "INSERT";
public static final String INTO = " INTO ";
public static final String INSERT_INTO = INSERT + INTO; public static final String INSERT_INTO = INSERT + INTO;
public static final String DELETE_FROM = DELETE + FROM; public static final String DELETE_FROM = DELETE + FROM;
public static final String SELECT_ALL_FROM = SELECT + ASTERISK + FROM; public static final String SELECT_ALL_FROM = SELECT + ASTERISK + FROM;
// === Oracle SQl ===
// === Oracle SQl ===
public static final String INSERT_ALL = "INSERT ALL "; public static final String INSERT_ALL = "INSERT ALL ";
public static final String INSERT_ALL_END = " SELECT 1 FROM DUAL"; public static final String INSERT_ALL_END = " SELECT 1 FROM DUAL";
// === Limit Offset === // === Limit Offset ===
public static final String TO = " TO "; public static final String TO = " TO ";
@ -93,7 +93,6 @@ public final class SqlConsts {
public static final String ROWNUM_RN_FROM = "SELECT * FROM (SELECT TEMP_DATAS.*, ROWNUM RN FROM ("; public static final String ROWNUM_RN_FROM = "SELECT * FROM (SELECT TEMP_DATAS.*, ROWNUM RN FROM (";
// === 联表查询关键字 === // === 联表查询关键字 ===
public static final String ON = " ON "; public static final String ON = " ON ";
public static final String JOIN = " JOIN "; public static final String JOIN = " JOIN ";
public static final String UNION = " UNION "; public static final String UNION = " UNION ";
@ -104,39 +103,34 @@ public final class SqlConsts {
public static final String INNER_JOIN = " INNER JOIN "; public static final String INNER_JOIN = " INNER JOIN ";
public static final String CROSS_JOIN = " CROSS JOIN "; public static final String CROSS_JOIN = " CROSS JOIN ";
// === 逻辑符号 ===
// === 逻辑符号 ===
public static final String GT = " > "; public static final String GT = " > ";
public static final String GE = " >= "; public static final String GE = " >= ";
public static final String LT = " < "; public static final String LT = " < ";
public static final String LE = " <= "; public static final String LE = " <= ";
public static final String NOT = " NOT "; public static final String NOT = " NOT ";
public static final String LIKE = " LIKE "; public static final String LIKE = " LIKE ";
public static final String EQUALS = " = "; public static final String EQUALS = " = ";
public static final String NOT_EQUALS = " != "; public static final String NOT_EQUALS = " != ";
public static final String IS_NULL = " IS NULL "; public static final String IS_NULL = " IS NULL ";
public static final String IS_NOT_NULL = " IS NOT NULL "; public static final String IS_NOT_NULL = " IS NOT NULL ";
public static final String IN = " IN "; public static final String IN = " IN ";
public static final String NOT_IN = " NOT IN "; public static final String NOT_IN = " NOT IN ";
public static final String BETWEEN = " BETWEEN "; public static final String BETWEEN = " BETWEEN ";
public static final String NOT_BETWEEN = " NOT BETWEEN "; public static final String NOT_BETWEEN = " NOT BETWEEN ";
public static final String EXISTS = " EXISTS "; public static final String EXISTS = " EXISTS ";
public static final String NOT_EXISTS = " NOT EXISTS "; public static final String NOT_EXISTS = " NOT EXISTS ";
// === 排序相关关键字 ===
// === 排序相关关键字 ===
public static final String ASC = " ASC"; public static final String ASC = " ASC";
public static final String DESC = " DESC"; public static final String DESC = " DESC";
public static final String NULLS_FIRST = " NULLS FIRST"; public static final String NULLS_FIRST = " NULLS FIRST";
public static final String NULLS_LAST = " NULLS LAST"; public static final String NULLS_LAST = " NULLS LAST";
// === SQL 函数名 ===
// === SQL 函数名 ===
public static final String SUM = "SUM"; public static final String SUM = "SUM";
public static final String MAX = "MIX"; public static final String MAX = "MIX";
public static final String MIN = "MIN"; public static final String MIN = "MIN";
@ -147,16 +141,17 @@ public final class SqlConsts {
public static final String COUNT = "COUNT"; public static final String COUNT = "COUNT";
public static final String CONVERT = "CONVERT"; public static final String CONVERT = "CONVERT";
// === 数学运算符 ===
// === 数学运算符 ===
public static final String PLUS_SIGN = " + "; public static final String PLUS_SIGN = " + ";
// === 数学运算符 ===
public static final String MINUS_SIGN = " - "; public static final String MINUS_SIGN = " - ";
public static final String DIVISION_SIGN = " / "; public static final String DIVISION_SIGN = " / ";
public static final String MULTIPLICATION_SIGN = " * "; public static final String MULTIPLICATION_SIGN = " * ";
public static final String EQUALS_PLACEHOLDER = " = ? ";
// === 其他拼接需要的字符串 === // === 其他拼接需要的字符串 ===
public static final String EQUALS_PLACEHOLDER = " = ? ";
public static final String AND_PLACEHOLDER = BLANK + PLACEHOLDER + AND + PLACEHOLDER + BLANK; public static final String AND_PLACEHOLDER = BLANK + PLACEHOLDER + AND + PLACEHOLDER + BLANK;
} }

View File

@ -91,8 +91,8 @@ public class CommonsDialectImpl implements IDialect {
sql.append(wrap(getRealSchema(schema))).append(REFERENCE); sql.append(wrap(getRealSchema(schema))).append(REFERENCE);
} }
sql.append(wrap(getRealTable(tableName))); sql.append(wrap(getRealTable(tableName)));
sql.append(LEFT_BRACKET).append(fields).append(RIGHT_BRACKET); sql.append(BRACKET_LEFT).append(fields).append(BRACKET_RIGHT);
sql.append(VALUES).append(LEFT_BRACKET).append(questions).append(RIGHT_BRACKET); sql.append(VALUES).append(BRACKET_LEFT).append(questions).append(BRACKET_RIGHT);
return sql.toString(); return sql.toString();
} }
@ -127,9 +127,9 @@ public class CommonsDialectImpl implements IDialect {
sql.append(wrap(getRealSchema(schema))).append(REFERENCE); sql.append(wrap(getRealSchema(schema))).append(REFERENCE);
} }
sql.append(wrap(getRealTable(tableName))); sql.append(wrap(getRealTable(tableName)));
sql.append(BLANK).append(LEFT_BRACKET) sql.append(BLANK).append(BRACKET_LEFT)
.append(fields) .append(fields)
.append(RIGHT_BRACKET).append(BLANK); .append(BRACKET_RIGHT).append(BLANK);
sql.append(VALUES).append(questions); sql.append(VALUES).append(questions);
return sql.toString(); return sql.toString();
} }
@ -170,14 +170,14 @@ public class CommonsDialectImpl implements IDialect {
if (i > 0) { if (i > 0) {
sql.append(OR); sql.append(OR);
} }
sql.append(LEFT_BRACKET); sql.append(BRACKET_LEFT);
for (int j = 0; j < primaryKeys.length; j++) { for (int j = 0; j < primaryKeys.length; j++) {
if (j > 0) { if (j > 0) {
sql.append(AND); sql.append(AND);
} }
sql.append(wrap(primaryKeys[j])).append(EQUALS_PLACEHOLDER); sql.append(wrap(primaryKeys[j])).append(EQUALS_PLACEHOLDER);
} }
sql.append(RIGHT_BRACKET); sql.append(BRACKET_RIGHT);
} }
} }
// 单主键 // 单主键
@ -318,7 +318,7 @@ public class CommonsDialectImpl implements IDialect {
List<UnionWrapper> unions = CPI.getUnions(queryWrapper); List<UnionWrapper> unions = CPI.getUnions(queryWrapper);
if (CollectionUtil.isNotEmpty(unions)) { if (CollectionUtil.isNotEmpty(unions)) {
sqlBuilder.insert(0, LEFT_BRACKET).append(RIGHT_BRACKET); sqlBuilder.insert(0, BRACKET_LEFT).append(BRACKET_RIGHT);
for (UnionWrapper unionWrapper : unions) { for (UnionWrapper unionWrapper : unions) {
unionWrapper.buildSql(sqlBuilder, this); unionWrapper.buildSql(sqlBuilder, this);
} }
@ -419,9 +419,9 @@ public class CommonsDialectImpl implements IDialect {
} }
} }
return sql.append(LEFT_BRACKET).append(sqlFields).append(RIGHT_BRACKET) return sql.append(BRACKET_LEFT).append(sqlFields).append(BRACKET_RIGHT)
.append(VALUES) .append(VALUES)
.append(LEFT_BRACKET).append(sqlValues).append(RIGHT_BRACKET) .append(BRACKET_LEFT).append(sqlValues).append(BRACKET_RIGHT)
.toString(); .toString();
} }
@ -434,14 +434,14 @@ public class CommonsDialectImpl implements IDialect {
for (int i = 0; i < insertColumns.length; i++) { for (int i = 0; i < insertColumns.length; i++) {
warpedInsertColumns[i] = wrap(insertColumns[i]); warpedInsertColumns[i] = wrap(insertColumns[i]);
} }
sql.append(LEFT_BRACKET) sql.append(BRACKET_LEFT)
.append(StringUtil.join(DELIMITER, warpedInsertColumns)) .append(StringUtil.join(DELIMITER, warpedInsertColumns))
.append(RIGHT_BRACKET); .append(BRACKET_RIGHT);
sql.append(VALUES); sql.append(VALUES);
Map<String, String> onInsertColumns = tableInfo.getOnInsertColumns(); Map<String, String> onInsertColumns = tableInfo.getOnInsertColumns();
for (int i = 0; i < entities.size(); i++) { for (int i = 0; i < entities.size(); i++) {
StringJoiner stringJoiner = new StringJoiner(DELIMITER, LEFT_BRACKET, RIGHT_BRACKET); StringJoiner stringJoiner = new StringJoiner(DELIMITER, BRACKET_LEFT, BRACKET_RIGHT);
for (String insertColumn : insertColumns) { for (String insertColumn : insertColumns) {
if (onInsertColumns != null && onInsertColumns.containsKey(insertColumn)) { if (onInsertColumns != null && onInsertColumns.containsKey(insertColumn)) {
//直接读取 onInsert 配置的值而不用 "?" 代替 //直接读取 onInsert 配置的值而不用 "?" 代替
@ -509,7 +509,7 @@ public class CommonsDialectImpl implements IDialect {
//多租户 //多租户
if (ArrayUtil.isNotEmpty(tenantIdArgs)) { if (ArrayUtil.isNotEmpty(tenantIdArgs)) {
deleteSQL = deleteSQL.replace(WHERE, WHERE + LEFT_BRACKET) + RIGHT_BRACKET; deleteSQL = deleteSQL.replace(WHERE, WHERE + BRACKET_LEFT) + BRACKET_RIGHT;
deleteSQL += AND + wrap(tableInfo.getTenantIdColumn()) + IN + buildQuestion(tenantIdArgs.length); deleteSQL += AND + wrap(tableInfo.getTenantIdColumn()) + IN + buildQuestion(tenantIdArgs.length);
} }
return deleteSQL; return deleteSQL;
@ -520,7 +520,7 @@ public class CommonsDialectImpl implements IDialect {
sql.append(tableInfo.getWrapSchemaAndTableName(this)); sql.append(tableInfo.getWrapSchemaAndTableName(this));
sql.append(SET).append(wrap(logicDeleteColumn)).append(EQUALS).append(getLogicDeletedValue()); sql.append(SET).append(wrap(logicDeleteColumn)).append(EQUALS).append(getLogicDeletedValue());
sql.append(WHERE); sql.append(WHERE);
sql.append(LEFT_BRACKET); sql.append(BRACKET_LEFT);
String[] primaryKeys = tableInfo.getPrimaryKeys(); String[] primaryKeys = tableInfo.getPrimaryKeys();
@ -530,14 +530,14 @@ public class CommonsDialectImpl implements IDialect {
if (i > 0) { if (i > 0) {
sql.append(OR); sql.append(OR);
} }
sql.append(LEFT_BRACKET); sql.append(BRACKET_LEFT);
for (int j = 0; j < primaryKeys.length; j++) { for (int j = 0; j < primaryKeys.length; j++) {
if (j > 0) { if (j > 0) {
sql.append(AND); sql.append(AND);
} }
sql.append(wrap(primaryKeys[j])).append(EQUALS_PLACEHOLDER); sql.append(wrap(primaryKeys[j])).append(EQUALS_PLACEHOLDER);
} }
sql.append(RIGHT_BRACKET); sql.append(BRACKET_RIGHT);
} }
} }
// 单主键 // 单主键
@ -550,7 +550,7 @@ public class CommonsDialectImpl implements IDialect {
} }
} }
sql.append(RIGHT_BRACKET).append(AND).append(wrap(logicDeleteColumn)).append(EQUALS).append(getLogicNormalValue()); sql.append(BRACKET_RIGHT).append(AND).append(wrap(logicDeleteColumn)).append(EQUALS).append(getLogicNormalValue());
if (ArrayUtil.isNotEmpty(tenantIdArgs)) { if (ArrayUtil.isNotEmpty(tenantIdArgs)) {
sql.append(AND).append(wrap(tableInfo.getTenantIdColumn())).append(IN).append(buildQuestion(tenantIdArgs.length)); sql.append(AND).append(wrap(tableInfo.getTenantIdColumn())).append(IN).append(buildQuestion(tenantIdArgs.length));
@ -807,7 +807,7 @@ public class CommonsDialectImpl implements IDialect {
String logicDeleteColumn = tableInfo.getLogicDeleteColumn(); String logicDeleteColumn = tableInfo.getLogicDeleteColumn();
Object[] tenantIdArgs = tableInfo.buildTenantIdArgs(); Object[] tenantIdArgs = tableInfo.buildTenantIdArgs();
if (StringUtil.isNotBlank(logicDeleteColumn) || ArrayUtil.isNotEmpty(tenantIdArgs)) { if (StringUtil.isNotBlank(logicDeleteColumn) || ArrayUtil.isNotEmpty(tenantIdArgs)) {
sql.append(LEFT_BRACKET); sql.append(BRACKET_LEFT);
} }
//多主键的场景 //多主键的场景
@ -816,14 +816,14 @@ public class CommonsDialectImpl implements IDialect {
if (i > 0) { if (i > 0) {
sql.append(OR); sql.append(OR);
} }
sql.append(LEFT_BRACKET); sql.append(BRACKET_LEFT);
for (int j = 0; j < primaryKeys.length; j++) { for (int j = 0; j < primaryKeys.length; j++) {
if (j > 0) { if (j > 0) {
sql.append(AND); sql.append(AND);
} }
sql.append(wrap(primaryKeys[j])).append(EQUALS_PLACEHOLDER); sql.append(wrap(primaryKeys[j])).append(EQUALS_PLACEHOLDER);
} }
sql.append(RIGHT_BRACKET); sql.append(BRACKET_RIGHT);
} }
} }
// 单主键 // 单主键
@ -837,7 +837,7 @@ public class CommonsDialectImpl implements IDialect {
} }
if (StringUtil.isNotBlank(logicDeleteColumn) || ArrayUtil.isNotEmpty(tenantIdArgs)) { if (StringUtil.isNotBlank(logicDeleteColumn) || ArrayUtil.isNotEmpty(tenantIdArgs)) {
sql.append(RIGHT_BRACKET); sql.append(BRACKET_RIGHT);
} }
@ -932,14 +932,14 @@ public class CommonsDialectImpl implements IDialect {
protected String buildQuestion(int count) { protected String buildQuestion(int count) {
StringBuilder sb = new StringBuilder(LEFT_BRACKET); StringBuilder sb = new StringBuilder(BRACKET_LEFT);
for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) {
sb.append(PLACEHOLDER); sb.append(PLACEHOLDER);
if (i != count - 1) { if (i != count - 1) {
sb.append(DELIMITER); sb.append(DELIMITER);
} }
} }
sb.append(RIGHT_BRACKET); sb.append(BRACKET_RIGHT);
return sb.toString(); return sb.toString();
} }

View File

@ -94,10 +94,10 @@ public class OracleDialect extends CommonsDialectImpl {
Map<String, String> onInsertColumns = tableInfo.getOnInsertColumns(); Map<String, String> onInsertColumns = tableInfo.getOnInsertColumns();
for (int i = 0; i < entities.size(); i++) { for (int i = 0; i < entities.size(); i++) {
sql.append(INTO).append(tableInfo.getWrapSchemaAndTableName(this)); sql.append(INTO).append(tableInfo.getWrapSchemaAndTableName(this));
sql.append(BLANK).append(LEFT_BRACKET).append(StringUtil.join(DELIMITER, warpedInsertColumns)).append(RIGHT_BRACKET); sql.append(BLANK).append(BRACKET_LEFT).append(StringUtil.join(DELIMITER, warpedInsertColumns)).append(BRACKET_RIGHT);
sql.append(VALUES); sql.append(VALUES);
StringJoiner stringJoiner = new StringJoiner(DELIMITER, LEFT_BRACKET, RIGHT_BRACKET); StringJoiner stringJoiner = new StringJoiner(DELIMITER, BRACKET_LEFT, BRACKET_RIGHT);
for (String insertColumn : insertColumns) { for (String insertColumn : insertColumns) {
if (onInsertColumns != null && onInsertColumns.containsKey(insertColumn)) { if (onInsertColumns != null && onInsertColumns.containsKey(insertColumn)) {
//直接读取 onInsert 配置的值而不用 "?" 代替 //直接读取 onInsert 配置的值而不用 "?" 代替
@ -147,7 +147,7 @@ public class OracleDialect extends CommonsDialectImpl {
for (int i = 0; i < rows.size(); i++) { for (int i = 0; i < rows.size(); i++) {
sql.append(INTO).append(tableNameWrap); sql.append(INTO).append(tableNameWrap);
sql.append(BLANK).append(LEFT_BRACKET).append(fields).append(RIGHT_BRACKET); sql.append(BLANK).append(BRACKET_LEFT).append(fields).append(BRACKET_RIGHT);
sql.append(VALUES).append(questionStrings); sql.append(VALUES).append(questionStrings);
} }

View File

@ -116,7 +116,7 @@ public class ArithmeticQueryColumn extends QueryColumn {
for (int i = 0; i < arithmeticInfos.size(); i++) { for (int i = 0; i < arithmeticInfos.size(); i++) {
sql.append(arithmeticInfos.get(i).toSql(queryTables, dialect, i)); sql.append(arithmeticInfos.get(i).toSql(queryTables, dialect, i));
} }
return SqlConsts.LEFT_BRACKET + sql + SqlConsts.RIGHT_BRACKET; return SqlConsts.BRACKET_LEFT + sql + SqlConsts.BRACKET_RIGHT;
} }

View File

@ -49,9 +49,9 @@ public class OperatorQueryCondition extends QueryCondition {
sql.append(prevEffectiveCondition.connector); sql.append(prevEffectiveCondition.connector);
} }
sql.append(operator) sql.append(operator)
.append(SqlConsts.LEFT_BRACKET) .append(SqlConsts.BRACKET_LEFT)
.append(childSql) .append(childSql)
.append(SqlConsts.RIGHT_BRACKET); .append(SqlConsts.BRACKET_RIGHT);
} }
} }

View File

@ -51,9 +51,9 @@ public class OperatorSelectCondition extends QueryCondition {
sql.append(prevEffectiveCondition.connector); sql.append(prevEffectiveCondition.connector);
} }
sql.append(operator) sql.append(operator)
.append(SqlConsts.LEFT_BRACKET) .append(SqlConsts.BRACKET_LEFT)
.append(childSql) .append(childSql)
.append(SqlConsts.RIGHT_BRACKET); .append(SqlConsts.BRACKET_RIGHT);
} }
} }

View File

@ -181,9 +181,9 @@ public class QueryCondition implements CloneSupport<QueryCondition> {
} }
//子查询 //子查询
else if (value instanceof QueryWrapper) { else if (value instanceof QueryWrapper) {
sql.append(SqlConsts.LEFT_BRACKET) sql.append(SqlConsts.BRACKET_LEFT)
.append(dialect.buildSelectSql((QueryWrapper) value)) .append(dialect.buildSelectSql((QueryWrapper) value))
.append(SqlConsts.RIGHT_BRACKET); .append(SqlConsts.BRACKET_RIGHT);
} }
//原生sql //原生sql
else if (value instanceof RawFragment) { else if (value instanceof RawFragment) {
@ -228,14 +228,14 @@ public class QueryCondition implements CloneSupport<QueryCondition> {
//in, not in //in, not in
else if (SqlConsts.IN.equals(logic) || SqlConsts.NOT_IN.equals(logic)) { else if (SqlConsts.IN.equals(logic) || SqlConsts.NOT_IN.equals(logic)) {
int paramsCount = calculateValueArrayCount(); int paramsCount = calculateValueArrayCount();
sqlBuilder.append(SqlConsts.LEFT_BRACKET); sqlBuilder.append(SqlConsts.BRACKET_LEFT);
for (int i = 0; i < paramsCount; i++) { for (int i = 0; i < paramsCount; i++) {
sqlBuilder.append(SqlConsts.PLACEHOLDER); sqlBuilder.append(SqlConsts.PLACEHOLDER);
if (i != paramsCount - 1) { if (i != paramsCount - 1) {
sqlBuilder.append(SqlConsts.DELIMITER); sqlBuilder.append(SqlConsts.DELIMITER);
} }
} }
sqlBuilder.append(SqlConsts.RIGHT_BRACKET); sqlBuilder.append(SqlConsts.BRACKET_RIGHT);
} else { } else {
sqlBuilder.append(SqlConsts.PLACEHOLDER); sqlBuilder.append(SqlConsts.PLACEHOLDER);
} }

View File

@ -61,9 +61,9 @@ public class UnionWrapper implements CloneSupport<UnionWrapper> {
public void buildSql(StringBuilder sqlBuilder, IDialect dialect) { public void buildSql(StringBuilder sqlBuilder, IDialect dialect) {
sqlBuilder.append(key) sqlBuilder.append(key)
.append(SqlConsts.LEFT_BRACKET) .append(SqlConsts.BRACKET_LEFT)
.append(dialect.buildSelectSql(queryWrapper)) .append(dialect.buildSelectSql(queryWrapper))
.append(SqlConsts.RIGHT_BRACKET); .append(SqlConsts.BRACKET_RIGHT);
} }
@Override @Override

View File

@ -142,11 +142,11 @@ class WrapperUtil {
static String withBracket(String sql) { static String withBracket(String sql) {
return SqlConsts.LEFT_BRACKET + sql + SqlConsts.RIGHT_BRACKET; return SqlConsts.BRACKET_LEFT + sql + SqlConsts.BRACKET_RIGHT;
} }
static String withAlias(String sql, String alias) { static String withAlias(String sql, String alias) {
return SqlConsts.LEFT_BRACKET + sql + SqlConsts.RIGHT_BRACKET + SqlConsts.AS + alias; return SqlConsts.BRACKET_LEFT + sql + SqlConsts.BRACKET_RIGHT + SqlConsts.AS + alias;
} }
static String withAliasIf(String alias, IDialect dialect) { static String withAliasIf(String alias, IDialect dialect) {

View File

@ -694,7 +694,11 @@ public class TableInfo {
//是否有循环引用 //是否有循环引用
boolean withCircularReference = context.contains(entityClass.getName()); boolean withCircularReference = context.contains(entityClass.getName());
String resultMapId = entityClass.getName() + (withCircularReference ? "$nested" : ""); if (withCircularReference) {
return null;
}
String resultMapId = entityClass.getName();
context.add(resultMapId); context.add(resultMapId);
if (configuration.hasResultMap(resultMapId)) { if (configuration.hasResultMap(resultMapId)) {
@ -734,30 +738,34 @@ public class TableInfo {
} }
// <resultMap> 标签下的 <association> 标签映射 // <resultMap> 标签下的 <association> 标签映射
if (!withCircularReference && associationType != null) { if (associationType != null) {
associationType.forEach((fieldName, fieldType) -> { associationType.forEach((fieldName, fieldType) -> {
// 获取嵌套类型的信息也就是 javaType 属性 // 获取嵌套类型的信息也就是 javaType 属性
TableInfo tableInfo = TableInfoFactory.ofEntityClass(fieldType); TableInfo tableInfo = TableInfoFactory.ofEntityClass(fieldType);
// 构建嵌套类型的 ResultMap 对象也就是 <association> 标签下的内容 // 构建嵌套类型的 ResultMap 对象也就是 <association> 标签下的内容
ResultMap nestedResultMap = tableInfo.doBuildResultMap(configuration, context); ResultMap nestedResultMap = tableInfo.doBuildResultMap(configuration, context);
resultMappings.add(new ResultMapping.Builder(configuration, fieldName) if (nestedResultMap != null) {
.javaType(fieldType) resultMappings.add(new ResultMapping.Builder(configuration, fieldName)
.nestedResultMapId(nestedResultMap.getId()) .javaType(fieldType)
.build()); .nestedResultMapId(nestedResultMap.getId())
.build());
}
}); });
} }
// <resultMap> 标签下的 <collection> 标签映射 // <resultMap> 标签下的 <collection> 标签映射
if (!withCircularReference && collectionType != null) { if (collectionType != null) {
collectionType.forEach((field, genericClass) -> { collectionType.forEach((field, genericClass) -> {
// 获取集合泛型类型的信息也就是 ofType 属性 // 获取集合泛型类型的信息也就是 ofType 属性
TableInfo tableInfo = TableInfoFactory.ofEntityClass(genericClass); TableInfo tableInfo = TableInfoFactory.ofEntityClass(genericClass);
// 构建嵌套类型的 ResultMap 对象也就是 <collection> 标签下的内容 // 构建嵌套类型的 ResultMap 对象也就是 <collection> 标签下的内容
ResultMap nestedResultMap = tableInfo.doBuildResultMap(configuration, context); ResultMap nestedResultMap = tableInfo.doBuildResultMap(configuration, context);
resultMappings.add(new ResultMapping.Builder(configuration, field.getName()) if (nestedResultMap != null) {
.javaType(field.getType()) resultMappings.add(new ResultMapping.Builder(configuration, field.getName())
.nestedResultMapId(nestedResultMap.getId()) .javaType(field.getType())
.build()); .nestedResultMapId(nestedResultMap.getId())
.build());
}
}); });
} }

View File

@ -216,12 +216,13 @@ public class TableInfoFactory {
) { ) {
// 集合嵌套 // 集合嵌套
if (Collection.class.isAssignableFrom(fieldType)) { if (Collection.class.isAssignableFrom(fieldType)) {
ParameterizedType genericType = (ParameterizedType) field.getGenericType(); Type genericType = field.getGenericType();
Type actualTypeArgument = genericType.getActualTypeArguments()[0]; if (genericType instanceof ParameterizedType){
Class<?> actualTypeArgument = (Class<?>) ((ParameterizedType) genericType).getActualTypeArguments()[0];
//需排除 List<String> List<Long> 等场景 //需排除 List<String> List<Long> 等场景
if (!defaultSupportColumnTypes.contains(actualTypeArgument)) { if (!defaultSupportColumnTypes.contains(actualTypeArgument)) {
tableInfo.addCollectionType(field, (Class<?>) actualTypeArgument); tableInfo.addCollectionType(field, actualTypeArgument);
}
} }
} }
// 实体类嵌套 // 实体类嵌套