mirror of
https://gitee.com/mybatis-flex/mybatis-flex.git
synced 2025-12-07 09:08:24 +08:00
refactor: 提取 SQL 构建时的常量。
This commit is contained in:
parent
7473cc6115
commit
f134705ce7
@ -0,0 +1,131 @@
|
||||
/*
|
||||
* Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com).
|
||||
* <p>
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* <p>
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* <p>
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.mybatisflex.core.constant;
|
||||
|
||||
/**
|
||||
* SQL 构建常量池。
|
||||
*
|
||||
* @author 王帅
|
||||
* @since 2023-06-12
|
||||
*/
|
||||
public final class SqlConsts {
|
||||
|
||||
public static final String EMPTY = "";
|
||||
|
||||
// === 常用符号 ===
|
||||
public static final String BLANK = " ";
|
||||
public static final String ASTERISK = "*";
|
||||
public static final String REFERENCE = ".";
|
||||
public static final String SEMICOLON = ";";
|
||||
public static final String DELIMITER = ", ";
|
||||
public static final String PLACEHOLDER = "?";
|
||||
public static final String PERCENT_SIGN = "%";
|
||||
public static final String SINGLE_QUOTE = "'";
|
||||
public static final String LEFT_BRACKET = "(";
|
||||
public static final String RIGHT_BRACKET = ")";
|
||||
public static final String HINT_START = "/*+ ";
|
||||
|
||||
// === SQL 关键字 ===
|
||||
public static final String HINT_END = " */ ";
|
||||
public static final String AS = " AS ";
|
||||
public static final String OR = " OR ";
|
||||
public static final String END = " END";
|
||||
public static final String AND = " AND ";
|
||||
public static final String SET = " SET ";
|
||||
public static final String CASE = "CASE";
|
||||
public static final String WHEN = " WHEN ";
|
||||
public static final String THEN = " THEN ";
|
||||
public static final String ELSE = " ELSE ";
|
||||
public static final String FROM = " FROM ";
|
||||
public static final String WHERE = " WHERE ";
|
||||
public static final String SELECT = "SELECT ";
|
||||
public static final String VALUES = " VALUES ";
|
||||
public static final String DELETE = "DELETE";
|
||||
public static final String UPDATE = "UPDATE ";
|
||||
public static final String HAVING = " HAVING ";
|
||||
public static final String DISTINCT = "DISTINCT ";
|
||||
public static final String GROUP_BY = " GROUP 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 DELETE_FROM = DELETE + FROM;
|
||||
public static final String SELECT_ALL_FROM = SELECT + ASTERISK + FROM;
|
||||
public static final String INSERT_ALL = "INSERT ALL ";
|
||||
|
||||
// === Oracle SQl ===
|
||||
public static final String INSERT_ALL_END = " SELECT 1 FROM DUAL";
|
||||
public static final String ON = " ON ";
|
||||
|
||||
// === 联表查询关键字 ===
|
||||
public static final String JOIN = " JOIN ";
|
||||
public static final String UNION = " UNION ";
|
||||
public static final String UNION_ALL = " UNION ALL ";
|
||||
public static final String LEFT_JOIN = " LEFT JOIN ";
|
||||
public static final String FULL_JOIN = " FULL JOIN ";
|
||||
public static final String RIGHT_JOIN = " RIGHT JOIN ";
|
||||
public static final String INNER_JOIN = " INNER JOIN ";
|
||||
public static final String CROSS_JOIN = " CROSS JOIN ";
|
||||
public static final String GT = " > ";
|
||||
|
||||
// === 逻辑符号 ===
|
||||
public static final String GE = " >= ";
|
||||
public static final String LT = " < ";
|
||||
public static final String LE = " <= ";
|
||||
public static final String NOT = " NOT ";
|
||||
public static final String LIKE = " LIKE ";
|
||||
public static final String EQUALS = " = ";
|
||||
public static final String NOT_EQUALS = " != ";
|
||||
public static final String IS_NULL = " IS NULL ";
|
||||
public static final String IS_NOT_NULL = " IS NOT NULL ";
|
||||
public static final String IN = " IN ";
|
||||
public static final String NOT_IN = " NOT IN ";
|
||||
public static final String BETWEEN = " BETWEEN ";
|
||||
public static final String NOT_BETWEEN = " NOT BETWEEN ";
|
||||
public static final String EXISTS = " EXISTS ";
|
||||
public static final String NOT_EXISTS = " NOT EXISTS ";
|
||||
public static final String ASC = " ASC";
|
||||
|
||||
// === 排序相关关键字 ===
|
||||
public static final String DESC = " DESC";
|
||||
public static final String NULLS_FIRST = " NULLS FIRST";
|
||||
public static final String NULLS_LAST = " NULLS LAST";
|
||||
public static final String SUM = "SUM";
|
||||
|
||||
// === SQL 函数名 ===
|
||||
public static final String MAX = "MIX";
|
||||
public static final String MIN = "MIN";
|
||||
public static final String AVG = "AVG";
|
||||
public static final String DAY = "DAY";
|
||||
public static final String YEAR = "YEAR";
|
||||
public static final String MONTH = "MONTH";
|
||||
public static final String COUNT = "COUNT";
|
||||
public static final String CONVERT = "CONVERT";
|
||||
public static final String PLUS_SIGN = " + ";
|
||||
|
||||
// === 数学运算符 ===
|
||||
public static final String MINUS_SIGN = " - ";
|
||||
public static final String DIVISION_SIGN = " / ";
|
||||
public static final String MULTIPLICATION_SIGN = " * ";
|
||||
public static final String EQUALS_PLACEHOLDER = " = ? ";
|
||||
|
||||
// === 其他拼接需要的字符串 ===
|
||||
public static final String AND_PLACEHOLDER = BLANK + PLACEHOLDER + AND + PLACEHOLDER + BLANK;
|
||||
private SqlConsts() {
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,4 +1,4 @@
|
||||
/**
|
||||
/*
|
||||
* Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com).
|
||||
* <p>
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@ -15,6 +15,7 @@
|
||||
*/
|
||||
package com.mybatisflex.core.dialect;
|
||||
|
||||
import com.mybatisflex.core.constant.SqlConsts;
|
||||
import com.mybatisflex.core.util.StringUtil;
|
||||
|
||||
import java.util.Collections;
|
||||
@ -88,7 +89,7 @@ public class KeywordWrap {
|
||||
}
|
||||
|
||||
public String wrap(String keyword) {
|
||||
if (StringUtil.isBlank(keyword) || "*".equals(keyword)) {
|
||||
if (StringUtil.isBlank(keyword) || SqlConsts.ASTERISK.equals(keyword)) {
|
||||
return keyword;
|
||||
}
|
||||
if (caseSensitive || keywords.isEmpty() || keywords.contains(keyword.toUpperCase(Locale.ENGLISH))) {
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
/**
|
||||
/*
|
||||
* Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com).
|
||||
* <p>
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@ -35,6 +35,8 @@ import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.StringJoiner;
|
||||
|
||||
import static com.mybatisflex.core.constant.SqlConsts.*;
|
||||
|
||||
/**
|
||||
* 通用的方言设计,其他方言可以继承于当前 CommonsDialectImpl
|
||||
* 创建或获取方言请参考 {@link com.mybatisflex.core.dialect.DialectFactory}
|
||||
@ -58,13 +60,13 @@ public class CommonsDialectImpl implements IDialect {
|
||||
|
||||
@Override
|
||||
public String wrap(String keyword) {
|
||||
return "*".equals(keyword) ? keyword : keywordWrap.wrap(keyword);
|
||||
return ASTERISK.equals(keyword) ? keyword : keywordWrap.wrap(keyword);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String forHint(String hintString) {
|
||||
return StringUtil.isNotBlank(hintString) ? "/*+ " + hintString + " */ " : "";
|
||||
return StringUtil.isNotBlank(hintString) ? HINT_START + hintString + HINT_END : EMPTY;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -76,21 +78,21 @@ public class CommonsDialectImpl implements IDialect {
|
||||
int index = 0;
|
||||
for (String attr : attrs) {
|
||||
fields.append(wrap(attr));
|
||||
questions.append("?");
|
||||
questions.append(PLACEHOLDER);
|
||||
if (index != attrs.size() - 1) {
|
||||
fields.append(", ");
|
||||
questions.append(", ");
|
||||
fields.append(DELIMITER);
|
||||
questions.append(DELIMITER);
|
||||
}
|
||||
index++;
|
||||
}
|
||||
StringBuilder sql = new StringBuilder();
|
||||
sql.append("INSERT INTO ");
|
||||
sql.append(INSERT_INTO);
|
||||
if (StringUtil.isNotBlank(schema)) {
|
||||
sql.append(wrap(getRealSchema(schema))).append(".");
|
||||
sql.append(wrap(getRealSchema(schema))).append(REFERENCE);
|
||||
}
|
||||
sql.append(wrap(getRealTable(tableName)));
|
||||
sql.append("(").append(fields).append(") ");
|
||||
sql.append(" VALUES ").append("(").append(questions).append(")");
|
||||
sql.append(LEFT_BRACKET).append(fields).append(RIGHT_BRACKET);
|
||||
sql.append(VALUES).append(LEFT_BRACKET).append(questions).append(RIGHT_BRACKET);
|
||||
return sql.toString();
|
||||
}
|
||||
|
||||
@ -106,27 +108,29 @@ public class CommonsDialectImpl implements IDialect {
|
||||
for (String column : attrs) {
|
||||
fields.append(wrap(column));
|
||||
if (index != attrs.size() - 1) {
|
||||
fields.append(", ");
|
||||
fields.append(DELIMITER);
|
||||
}
|
||||
index++;
|
||||
}
|
||||
|
||||
for (int i = 0; i < rows.size(); i++) {
|
||||
questions.append(buildQuestion(attrs.size(), true));
|
||||
questions.append(buildQuestion(attrs.size()));
|
||||
if (i != rows.size() - 1) {
|
||||
questions.append(",");
|
||||
questions.append(DELIMITER);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
StringBuilder sql = new StringBuilder();
|
||||
sql.append("INSERT INTO ");
|
||||
sql.append(INSERT_INTO);
|
||||
if (StringUtil.isNotBlank(schema)) {
|
||||
sql.append(wrap(getRealSchema(schema))).append(".");
|
||||
sql.append(wrap(getRealSchema(schema))).append(REFERENCE);
|
||||
}
|
||||
sql.append(wrap(getRealTable(tableName)));
|
||||
sql.append(" (").append(fields).append(") ");
|
||||
sql.append(" VALUES ").append(questions);
|
||||
sql.append(BLANK).append(LEFT_BRACKET)
|
||||
.append(fields)
|
||||
.append(RIGHT_BRACKET).append(BLANK);
|
||||
sql.append(VALUES).append(questions);
|
||||
return sql.toString();
|
||||
}
|
||||
|
||||
@ -134,17 +138,17 @@ public class CommonsDialectImpl implements IDialect {
|
||||
@Override
|
||||
public String forDeleteById(String schema, String tableName, String[] primaryKeys) {
|
||||
StringBuilder sql = new StringBuilder();
|
||||
sql.append("DELETE FROM ");
|
||||
sql.append(DELETE_FROM);
|
||||
if (StringUtil.isNotBlank(schema)) {
|
||||
sql.append(wrap(getRealSchema(schema))).append(".");
|
||||
sql.append(wrap(getRealSchema(schema))).append(REFERENCE);
|
||||
}
|
||||
sql.append(wrap(getRealTable(tableName)));
|
||||
sql.append(" WHERE ");
|
||||
sql.append(WHERE);
|
||||
for (int i = 0; i < primaryKeys.length; i++) {
|
||||
if (i > 0) {
|
||||
sql.append(" AND ");
|
||||
sql.append(AND);
|
||||
}
|
||||
sql.append(wrap(primaryKeys[i])).append(" = ?");
|
||||
sql.append(wrap(primaryKeys[i])).append(EQUALS_PLACEHOLDER);
|
||||
}
|
||||
return sql.toString();
|
||||
}
|
||||
@ -153,36 +157,36 @@ public class CommonsDialectImpl implements IDialect {
|
||||
@Override
|
||||
public String forDeleteBatchByIds(String schema, String tableName, String[] primaryKeys, Object[] ids) {
|
||||
StringBuilder sql = new StringBuilder();
|
||||
sql.append("DELETE FROM ");
|
||||
sql.append(DELETE_FROM);
|
||||
if (StringUtil.isNotBlank(schema)) {
|
||||
sql.append(wrap(getRealSchema(schema))).append(".");
|
||||
sql.append(wrap(getRealSchema(schema))).append(REFERENCE);
|
||||
}
|
||||
sql.append(wrap(getRealTable(tableName)));
|
||||
sql.append(" WHERE ");
|
||||
sql.append(WHERE);
|
||||
|
||||
//多主键的场景
|
||||
if (primaryKeys.length > 1) {
|
||||
for (int i = 0; i < ids.length / primaryKeys.length; i++) {
|
||||
if (i > 0) {
|
||||
sql.append(" OR ");
|
||||
sql.append(OR);
|
||||
}
|
||||
sql.append("(");
|
||||
sql.append(LEFT_BRACKET);
|
||||
for (int j = 0; j < primaryKeys.length; j++) {
|
||||
if (j > 0) {
|
||||
sql.append(" AND ");
|
||||
sql.append(AND);
|
||||
}
|
||||
sql.append(wrap(primaryKeys[j])).append(" = ?");
|
||||
sql.append(wrap(primaryKeys[j])).append(EQUALS_PLACEHOLDER);
|
||||
}
|
||||
sql.append(")");
|
||||
sql.append(RIGHT_BRACKET);
|
||||
}
|
||||
}
|
||||
// 单主键
|
||||
else {
|
||||
for (int i = 0; i < ids.length; i++) {
|
||||
if (i > 0) {
|
||||
sql.append(" OR ");
|
||||
sql.append(OR);
|
||||
}
|
||||
sql.append(wrap(primaryKeys[0])).append(" = ?");
|
||||
sql.append(wrap(primaryKeys[0])).append(EQUALS_PLACEHOLDER);
|
||||
}
|
||||
}
|
||||
return sql.toString();
|
||||
@ -200,28 +204,28 @@ public class CommonsDialectImpl implements IDialect {
|
||||
Set<String> modifyAttrs = row.obtainModifyAttrs();
|
||||
String[] primaryKeys = RowCPI.obtainsPrimaryKeyStrings(row);
|
||||
|
||||
sql.append("UPDATE ");
|
||||
sql.append(UPDATE);
|
||||
if (StringUtil.isNotBlank(schema)) {
|
||||
sql.append(wrap(getRealSchema(schema))).append(".");
|
||||
sql.append(wrap(getRealSchema(schema))).append(REFERENCE);
|
||||
}
|
||||
sql.append(wrap(getRealTable(tableName))).append(" SET ");
|
||||
sql.append(wrap(getRealTable(tableName))).append(SET);
|
||||
int index = 0;
|
||||
for (Map.Entry<String, Object> e : row.entrySet()) {
|
||||
String colName = e.getKey();
|
||||
if (modifyAttrs.contains(colName) && !ArrayUtil.contains(primaryKeys, colName)) {
|
||||
if (index > 0) {
|
||||
sql.append(", ");
|
||||
sql.append(DELIMITER);
|
||||
}
|
||||
sql.append(wrap(colName)).append(" = ? ");
|
||||
sql.append(wrap(colName)).append(EQUALS_PLACEHOLDER);
|
||||
index++;
|
||||
}
|
||||
}
|
||||
sql.append(" WHERE ");
|
||||
sql.append(WHERE);
|
||||
for (int i = 0; i < primaryKeys.length; i++) {
|
||||
if (i > 0) {
|
||||
sql.append(" AND ");
|
||||
sql.append(AND);
|
||||
}
|
||||
sql.append(wrap(primaryKeys[i])).append(" = ?");
|
||||
sql.append(wrap(primaryKeys[i])).append(EQUALS_PLACEHOLDER);
|
||||
}
|
||||
|
||||
return sql.toString();
|
||||
@ -241,19 +245,19 @@ public class CommonsDialectImpl implements IDialect {
|
||||
//fix: support schema
|
||||
QueryTable queryTable = queryTables.get(0);
|
||||
// String tableName = queryTables.get(0).getName();
|
||||
sql.append("UPDATE ").append(queryTable.toSql(this)).append(" SET ");
|
||||
sql.append(UPDATE).append(queryTable.toSql(this)).append(SET);
|
||||
int index = 0;
|
||||
for (String modifyAttr : modifyAttrs) {
|
||||
if (index > 0) {
|
||||
sql.append(", ");
|
||||
sql.append(DELIMITER);
|
||||
}
|
||||
sql.append(wrap(modifyAttr)).append(" = ? ");
|
||||
sql.append(wrap(modifyAttr)).append(EQUALS_PLACEHOLDER);
|
||||
index++;
|
||||
}
|
||||
|
||||
String whereConditionSql = buildWhereConditionSql(queryWrapper);
|
||||
if (StringUtil.isNotBlank(whereConditionSql)) {
|
||||
sql.append(" WHERE ").append(whereConditionSql);
|
||||
sql.append(WHERE).append(whereConditionSql);
|
||||
}
|
||||
|
||||
return sql.toString();
|
||||
@ -266,7 +270,7 @@ public class CommonsDialectImpl implements IDialect {
|
||||
}
|
||||
StringBuilder sql = new StringBuilder();
|
||||
for (Row row : rows) {
|
||||
sql.append(forUpdateById(schema, tableName, row)).append("; ");
|
||||
sql.append(forUpdateById(schema, tableName, row)).append(SEMICOLON).append(BLANK);
|
||||
}
|
||||
return sql.toString();
|
||||
}
|
||||
@ -274,16 +278,16 @@ public class CommonsDialectImpl implements IDialect {
|
||||
|
||||
@Override
|
||||
public String forSelectOneById(String schema, String tableName, String[] primaryKeys, Object[] primaryValues) {
|
||||
StringBuilder sql = new StringBuilder("SELECT * FROM ");
|
||||
StringBuilder sql = new StringBuilder(SELECT_ALL_FROM);
|
||||
if (StringUtil.isNotBlank(schema)) {
|
||||
sql.append(wrap(getRealSchema(schema))).append(".");
|
||||
sql.append(wrap(getRealSchema(schema))).append(REFERENCE);
|
||||
}
|
||||
sql.append(wrap(getRealTable(tableName))).append(" WHERE ");
|
||||
sql.append(wrap(getRealTable(tableName))).append(WHERE);
|
||||
for (int i = 0; i < primaryKeys.length; i++) {
|
||||
if (i > 0) {
|
||||
sql.append(" AND ");
|
||||
sql.append(AND);
|
||||
}
|
||||
sql.append(wrap(primaryKeys[i])).append(" = ?");
|
||||
sql.append(wrap(primaryKeys[i])).append(EQUALS_PLACEHOLDER);
|
||||
}
|
||||
return sql.toString();
|
||||
}
|
||||
@ -304,7 +308,7 @@ public class CommonsDialectImpl implements IDialect {
|
||||
List<QueryColumn> selectColumns = CPI.getSelectColumns(queryWrapper);
|
||||
|
||||
StringBuilder sqlBuilder = buildSelectColumnSql(allTables, selectColumns, CPI.getHint(queryWrapper));
|
||||
sqlBuilder.append(" FROM ").append(StringUtil.join(", ", queryTables, queryTable -> queryTable.toSql(this)));
|
||||
sqlBuilder.append(FROM).append(StringUtil.join(DELIMITER, queryTables, queryTable -> queryTable.toSql(this)));
|
||||
|
||||
buildJoinSql(sqlBuilder, queryWrapper, allTables);
|
||||
buildWhereSql(sqlBuilder, queryWrapper, allTables, true);
|
||||
@ -314,7 +318,7 @@ public class CommonsDialectImpl implements IDialect {
|
||||
|
||||
List<UnionWrapper> unions = CPI.getUnions(queryWrapper);
|
||||
if (CollectionUtil.isNotEmpty(unions)) {
|
||||
sqlBuilder.insert(0, "(").append(")");
|
||||
sqlBuilder.insert(0, LEFT_BRACKET).append(RIGHT_BRACKET);
|
||||
for (UnionWrapper unionWrapper : unions) {
|
||||
unionWrapper.buildSql(sqlBuilder, this);
|
||||
}
|
||||
@ -329,7 +333,7 @@ public class CommonsDialectImpl implements IDialect {
|
||||
List<String> endFragments = CPI.getEndFragments(queryWrapper);
|
||||
if (CollectionUtil.isNotEmpty(endFragments)) {
|
||||
for (String endFragment : endFragments) {
|
||||
sqlBuilder.append(" ").append(endFragment);
|
||||
sqlBuilder.append(BLANK).append(endFragment);
|
||||
}
|
||||
}
|
||||
|
||||
@ -337,17 +341,17 @@ public class CommonsDialectImpl implements IDialect {
|
||||
}
|
||||
|
||||
private StringBuilder buildSelectColumnSql(List<QueryTable> queryTables, List<QueryColumn> selectColumns, String hint) {
|
||||
StringBuilder sqlBuilder = new StringBuilder("SELECT ");
|
||||
StringBuilder sqlBuilder = new StringBuilder(SELECT);
|
||||
sqlBuilder.append(forHint(hint));
|
||||
if (selectColumns == null || selectColumns.isEmpty()) {
|
||||
sqlBuilder.append("*");
|
||||
sqlBuilder.append(ASTERISK);
|
||||
} else {
|
||||
int index = 0;
|
||||
for (QueryColumn selectColumn : selectColumns) {
|
||||
String selectColumnSql = CPI.toSelectSql(selectColumn, queryTables, this);
|
||||
sqlBuilder.append(selectColumnSql);
|
||||
if (index != selectColumns.size() - 1) {
|
||||
sqlBuilder.append(", ");
|
||||
sqlBuilder.append(DELIMITER);
|
||||
}
|
||||
index++;
|
||||
}
|
||||
@ -363,8 +367,12 @@ public class CommonsDialectImpl implements IDialect {
|
||||
List<QueryTable> allTables = CollectionUtil.merge(queryTables, joinTables);
|
||||
|
||||
//ignore selectColumns
|
||||
StringBuilder sqlBuilder = new StringBuilder("DELETE " + forHint(CPI.getHint(queryWrapper)) + "FROM ");
|
||||
sqlBuilder.append(StringUtil.join(", ", queryTables, queryTable -> queryTable.toSql(this)));
|
||||
StringBuilder sqlBuilder = new StringBuilder(DELETE);
|
||||
String hint = CPI.getHint(queryWrapper);
|
||||
if (StringUtil.isNotBlank(hint)) {
|
||||
sqlBuilder.append(BLANK).append(hint).deleteCharAt(sqlBuilder.length() - 1);
|
||||
}
|
||||
sqlBuilder.append(FROM).append(StringUtil.join(DELIMITER, queryTables, queryTable -> queryTable.toSql(this)));
|
||||
|
||||
buildJoinSql(sqlBuilder, queryWrapper, allTables);
|
||||
buildWhereSql(sqlBuilder, queryWrapper, allTables, false);
|
||||
@ -378,7 +386,7 @@ public class CommonsDialectImpl implements IDialect {
|
||||
List<String> endFragments = CPI.getEndFragments(queryWrapper);
|
||||
if (CollectionUtil.isNotEmpty(endFragments)) {
|
||||
for (String endFragment : endFragments) {
|
||||
sqlBuilder.append(" ").append(endFragment);
|
||||
sqlBuilder.append(BLANK).append(endFragment);
|
||||
}
|
||||
}
|
||||
|
||||
@ -388,60 +396,63 @@ public class CommonsDialectImpl implements IDialect {
|
||||
@Override
|
||||
public String buildWhereConditionSql(QueryWrapper queryWrapper) {
|
||||
QueryCondition whereQueryCondition = CPI.getWhereQueryCondition(queryWrapper);
|
||||
return whereQueryCondition != null ? whereQueryCondition.toSql(CPI.getQueryTables(queryWrapper), this) : "";
|
||||
return whereQueryCondition != null ? whereQueryCondition.toSql(CPI.getQueryTables(queryWrapper), this) : EMPTY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String forInsertEntity(TableInfo tableInfo, Object entity, boolean ignoreNulls) {
|
||||
StringBuilder sql = new StringBuilder();
|
||||
sql.append("INSERT INTO ").append(tableInfo.getWrapSchemaAndTableName(this));
|
||||
sql.append(INSERT_INTO).append(tableInfo.getWrapSchemaAndTableName(this));
|
||||
|
||||
String[] insertColumns = tableInfo.obtainInsertColumns(entity, ignoreNulls);
|
||||
Map<String, String> onInsertColumns = tableInfo.getOnInsertColumns();
|
||||
|
||||
StringJoiner sqlFields = new StringJoiner(", ");
|
||||
StringJoiner sqlValues = new StringJoiner(", ");
|
||||
StringJoiner sqlFields = new StringJoiner(DELIMITER);
|
||||
StringJoiner sqlValues = new StringJoiner(DELIMITER);
|
||||
|
||||
for (String insertColumn : insertColumns) {
|
||||
sqlFields.add(wrap(insertColumn));
|
||||
if (onInsertColumns != null && onInsertColumns.containsKey(insertColumn)) {
|
||||
sqlValues.add(onInsertColumns.get(insertColumn));
|
||||
} else {
|
||||
sqlValues.add("?");
|
||||
sqlValues.add(PLACEHOLDER);
|
||||
}
|
||||
}
|
||||
|
||||
return sql.append("(").append(sqlFields).append(")")
|
||||
.append(" VALUES ")
|
||||
.append("(").append(sqlValues).append(")").toString();
|
||||
return sql.append(LEFT_BRACKET).append(sqlFields).append(RIGHT_BRACKET)
|
||||
.append(VALUES)
|
||||
.append(LEFT_BRACKET).append(sqlValues).append(RIGHT_BRACKET)
|
||||
.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String forInsertEntityBatch(TableInfo tableInfo, List<?> entities) {
|
||||
StringBuilder sql = new StringBuilder();
|
||||
sql.append("INSERT INTO ").append(tableInfo.getWrapSchemaAndTableName(this));
|
||||
sql.append(INSERT_INTO).append(tableInfo.getWrapSchemaAndTableName(this));
|
||||
String[] insertColumns = tableInfo.obtainInsertColumns(null, false);
|
||||
String[] warpedInsertColumns = new String[insertColumns.length];
|
||||
for (int i = 0; i < insertColumns.length; i++) {
|
||||
warpedInsertColumns[i] = wrap(insertColumns[i]);
|
||||
}
|
||||
sql.append("(").append(StringUtil.join(", ", warpedInsertColumns)).append(")");
|
||||
sql.append(" VALUES ");
|
||||
sql.append(LEFT_BRACKET)
|
||||
.append(StringUtil.join(DELIMITER, warpedInsertColumns))
|
||||
.append(RIGHT_BRACKET);
|
||||
sql.append(VALUES);
|
||||
|
||||
Map<String, String> onInsertColumns = tableInfo.getOnInsertColumns();
|
||||
for (int i = 0; i < entities.size(); i++) {
|
||||
StringJoiner stringJoiner = new StringJoiner(", ", "(", ")");
|
||||
StringJoiner stringJoiner = new StringJoiner(DELIMITER, LEFT_BRACKET, RIGHT_BRACKET);
|
||||
for (String insertColumn : insertColumns) {
|
||||
if (onInsertColumns != null && onInsertColumns.containsKey(insertColumn)) {
|
||||
//直接读取 onInsert 配置的值,而不用 "?" 代替
|
||||
stringJoiner.add(onInsertColumns.get(insertColumn));
|
||||
} else {
|
||||
stringJoiner.add("?");
|
||||
stringJoiner.add(PLACEHOLDER);
|
||||
}
|
||||
}
|
||||
sql.append(stringJoiner);
|
||||
if (i != entities.size() - 1) {
|
||||
sql.append(", ");
|
||||
sql.append(DELIMITER);
|
||||
}
|
||||
}
|
||||
|
||||
@ -457,7 +468,7 @@ public class CommonsDialectImpl implements IDialect {
|
||||
String deleteByIdSql = forDeleteById(tableInfo.getSchema(), tableInfo.getTableName(), tableInfo.getPrimaryKeys());
|
||||
|
||||
if (ArrayUtil.isNotEmpty(tenantIdArgs)) {
|
||||
deleteByIdSql += " AND " + wrap(tableInfo.getTenantIdColumn()) + " IN " + buildQuestion(tenantIdArgs.length, true);
|
||||
deleteByIdSql += AND + wrap(tableInfo.getTenantIdColumn()) + IN + buildQuestion(tenantIdArgs.length);
|
||||
}
|
||||
return deleteByIdSql;
|
||||
}
|
||||
@ -466,21 +477,21 @@ public class CommonsDialectImpl implements IDialect {
|
||||
StringBuilder sql = new StringBuilder();
|
||||
String[] primaryKeys = tableInfo.getPrimaryKeys();
|
||||
|
||||
sql.append("UPDATE ").append(tableInfo.getWrapSchemaAndTableName(this));
|
||||
sql.append(" SET ").append(wrap(logicDeleteColumn)).append(" = ").append(getLogicDeletedValue());
|
||||
sql.append(" WHERE ");
|
||||
sql.append(UPDATE).append(tableInfo.getWrapSchemaAndTableName(this));
|
||||
sql.append(SET).append(wrap(logicDeleteColumn)).append(EQUALS).append(getLogicDeletedValue());
|
||||
sql.append(WHERE);
|
||||
for (int i = 0; i < primaryKeys.length; i++) {
|
||||
if (i > 0) {
|
||||
sql.append(" AND ");
|
||||
sql.append(AND);
|
||||
}
|
||||
sql.append(wrap(primaryKeys[i])).append(" = ?");
|
||||
sql.append(wrap(primaryKeys[i])).append(EQUALS_PLACEHOLDER);
|
||||
}
|
||||
|
||||
sql.append(" AND ").append(wrap(logicDeleteColumn)).append(" = ").append(getLogicNormalValue());
|
||||
sql.append(AND).append(wrap(logicDeleteColumn)).append(EQUALS).append(getLogicNormalValue());
|
||||
|
||||
//租户ID
|
||||
if (ArrayUtil.isNotEmpty(tenantIdArgs)) {
|
||||
sql.append(" AND ").append(wrap(tableInfo.getTenantIdColumn())).append(" IN ").append(buildQuestion(tenantIdArgs.length, true));
|
||||
sql.append(AND).append(wrap(tableInfo.getTenantIdColumn())).append(IN).append(buildQuestion(tenantIdArgs.length));
|
||||
}
|
||||
|
||||
return sql.toString();
|
||||
@ -498,18 +509,18 @@ public class CommonsDialectImpl implements IDialect {
|
||||
|
||||
//多租户
|
||||
if (ArrayUtil.isNotEmpty(tenantIdArgs)) {
|
||||
deleteSQL = deleteSQL.replace(" WHERE ", " WHERE (") + ")";
|
||||
deleteSQL += " AND " + wrap(tableInfo.getTenantIdColumn()) + " IN " + buildQuestion(tenantIdArgs.length, true);
|
||||
deleteSQL = deleteSQL.replace(WHERE, WHERE + LEFT_BRACKET) + RIGHT_BRACKET;
|
||||
deleteSQL += AND + wrap(tableInfo.getTenantIdColumn()) + IN + buildQuestion(tenantIdArgs.length);
|
||||
}
|
||||
return deleteSQL;
|
||||
}
|
||||
|
||||
StringBuilder sql = new StringBuilder();
|
||||
sql.append("UPDATE ");
|
||||
sql.append(UPDATE);
|
||||
sql.append(tableInfo.getWrapSchemaAndTableName(this));
|
||||
sql.append(" SET ").append(wrap(logicDeleteColumn)).append(" = ").append(getLogicDeletedValue());
|
||||
sql.append(" WHERE ");
|
||||
sql.append("(");
|
||||
sql.append(SET).append(wrap(logicDeleteColumn)).append(EQUALS).append(getLogicDeletedValue());
|
||||
sql.append(WHERE);
|
||||
sql.append(LEFT_BRACKET);
|
||||
|
||||
String[] primaryKeys = tableInfo.getPrimaryKeys();
|
||||
|
||||
@ -517,32 +528,32 @@ public class CommonsDialectImpl implements IDialect {
|
||||
if (primaryKeys.length > 1) {
|
||||
for (int i = 0; i < primaryValues.length / primaryKeys.length; i++) {
|
||||
if (i > 0) {
|
||||
sql.append(" OR ");
|
||||
sql.append(OR);
|
||||
}
|
||||
sql.append("(");
|
||||
sql.append(LEFT_BRACKET);
|
||||
for (int j = 0; j < primaryKeys.length; j++) {
|
||||
if (j > 0) {
|
||||
sql.append(" AND ");
|
||||
sql.append(AND);
|
||||
}
|
||||
sql.append(wrap(primaryKeys[j])).append(" = ?");
|
||||
sql.append(wrap(primaryKeys[j])).append(EQUALS_PLACEHOLDER);
|
||||
}
|
||||
sql.append(")");
|
||||
sql.append(RIGHT_BRACKET);
|
||||
}
|
||||
}
|
||||
// 单主键
|
||||
else {
|
||||
for (int i = 0; i < primaryValues.length; i++) {
|
||||
if (i > 0) {
|
||||
sql.append(" OR ");
|
||||
sql.append(OR);
|
||||
}
|
||||
sql.append(wrap(primaryKeys[0])).append(" = ?");
|
||||
sql.append(wrap(primaryKeys[0])).append(EQUALS_PLACEHOLDER);
|
||||
}
|
||||
}
|
||||
|
||||
sql.append(") AND ").append(wrap(logicDeleteColumn)).append(" = ").append(getLogicNormalValue());
|
||||
sql.append(RIGHT_BRACKET).append(AND).append(wrap(logicDeleteColumn)).append(EQUALS).append(getLogicNormalValue());
|
||||
|
||||
if (ArrayUtil.isNotEmpty(tenantIdArgs)) {
|
||||
sql.append(" AND ").append(wrap(tableInfo.getTenantIdColumn())).append(" IN ").append(buildQuestion(tenantIdArgs.length, true));
|
||||
sql.append(AND).append(wrap(tableInfo.getTenantIdColumn())).append(IN).append(buildQuestion(tenantIdArgs.length));
|
||||
}
|
||||
|
||||
return sql.toString();
|
||||
@ -565,9 +576,9 @@ public class CommonsDialectImpl implements IDialect {
|
||||
List<QueryTable> allTables = CollectionUtil.merge(queryTables, joinTables);
|
||||
|
||||
//ignore selectColumns
|
||||
StringBuilder sqlBuilder = new StringBuilder("UPDATE ").append(forHint(CPI.getHint(queryWrapper)));
|
||||
StringBuilder sqlBuilder = new StringBuilder(UPDATE).append(forHint(CPI.getHint(queryWrapper)));
|
||||
sqlBuilder.append(tableInfo.getWrapSchemaAndTableName(this));
|
||||
sqlBuilder.append(" SET ").append(wrap(logicDeleteColumn)).append(" = ").append(getLogicDeletedValue());
|
||||
sqlBuilder.append(SET).append(wrap(logicDeleteColumn)).append(EQUALS).append(getLogicDeletedValue());
|
||||
|
||||
|
||||
buildJoinSql(sqlBuilder, queryWrapper, allTables);
|
||||
@ -590,39 +601,39 @@ public class CommonsDialectImpl implements IDialect {
|
||||
Set<String> modifyAttrs = tableInfo.obtainUpdateColumns(entity, ignoreNulls, false);
|
||||
String[] primaryKeys = tableInfo.getPrimaryKeys();
|
||||
|
||||
sql.append("UPDATE ").append(tableInfo.getWrapSchemaAndTableName(this)).append(" SET ");
|
||||
sql.append(UPDATE).append(tableInfo.getWrapSchemaAndTableName(this)).append(SET);
|
||||
|
||||
StringJoiner stringJoiner = new StringJoiner(", ");
|
||||
StringJoiner stringJoiner = new StringJoiner(DELIMITER);
|
||||
|
||||
for (String modifyAttr : modifyAttrs) {
|
||||
stringJoiner.add(wrap(modifyAttr) + " = ?");
|
||||
stringJoiner.add(wrap(modifyAttr) + EQUALS_PLACEHOLDER);
|
||||
}
|
||||
|
||||
Map<String, String> onUpdateColumns = tableInfo.getOnUpdateColumns();
|
||||
if (onUpdateColumns != null && !onUpdateColumns.isEmpty()) {
|
||||
onUpdateColumns.forEach((column, value) -> stringJoiner.add(wrap(column) + " = " + value));
|
||||
onUpdateColumns.forEach((column, value) -> stringJoiner.add(wrap(column) + EQUALS + value));
|
||||
}
|
||||
|
||||
//乐观锁字段
|
||||
String versionColumn = tableInfo.getVersionColumn();
|
||||
if (StringUtil.isNotBlank(versionColumn)) {
|
||||
stringJoiner.add(wrap(versionColumn) + " = " + wrap(versionColumn) + " + 1 ");
|
||||
stringJoiner.add(wrap(versionColumn) + EQUALS + wrap(versionColumn) + " + 1 ");
|
||||
}
|
||||
|
||||
sql.append(stringJoiner);
|
||||
|
||||
sql.append(" WHERE ");
|
||||
sql.append(WHERE);
|
||||
for (int i = 0; i < primaryKeys.length; i++) {
|
||||
if (i > 0) {
|
||||
sql.append(" AND ");
|
||||
sql.append(AND);
|
||||
}
|
||||
sql.append(wrap(primaryKeys[i])).append(" = ?");
|
||||
sql.append(wrap(primaryKeys[i])).append(EQUALS_PLACEHOLDER);
|
||||
}
|
||||
|
||||
//逻辑删除条件,已删除的数据不能被修改
|
||||
String logicDeleteColumn = tableInfo.getLogicDeleteColumn();
|
||||
if (StringUtil.isNotBlank(logicDeleteColumn)) {
|
||||
sql.append(" AND ").append(wrap(logicDeleteColumn)).append(" = ").append(getLogicNormalValue());
|
||||
sql.append(AND).append(wrap(logicDeleteColumn)).append(EQUALS).append(getLogicNormalValue());
|
||||
}
|
||||
|
||||
|
||||
@ -630,9 +641,9 @@ public class CommonsDialectImpl implements IDialect {
|
||||
Object[] tenantIdArgs = tableInfo.buildTenantIdArgs();
|
||||
if (ArrayUtil.isNotEmpty(tenantIdArgs)) {
|
||||
if (tenantIdArgs.length == 1) {
|
||||
sql.append(" AND ").append(wrap(tableInfo.getTenantIdColumn())).append(" = ?");
|
||||
sql.append(AND).append(wrap(tableInfo.getTenantIdColumn())).append(EQUALS_PLACEHOLDER);
|
||||
} else {
|
||||
sql.append(" AND ").append(wrap(tableInfo.getTenantIdColumn())).append(" IN ").append(buildQuestion(tenantIdArgs.length, true));
|
||||
sql.append(AND).append(wrap(tableInfo.getTenantIdColumn())).append(IN).append(buildQuestion(tenantIdArgs.length));
|
||||
}
|
||||
}
|
||||
|
||||
@ -642,7 +653,7 @@ public class CommonsDialectImpl implements IDialect {
|
||||
if (versionValue == null) {
|
||||
throw FlexExceptions.wrap("The version value of entity[%s] must not be null.", entity);
|
||||
}
|
||||
sql.append(" AND ").append(wrap(versionColumn)).append(" = ").append(versionValue);
|
||||
sql.append(AND).append(wrap(versionColumn)).append(EQUALS).append(versionValue);
|
||||
}
|
||||
|
||||
|
||||
@ -655,24 +666,24 @@ public class CommonsDialectImpl implements IDialect {
|
||||
|
||||
Set<String> modifyAttrs = tableInfo.obtainUpdateColumns(entity, ignoreNulls, true);
|
||||
|
||||
sql.append("UPDATE ").append(forHint(CPI.getHint(queryWrapper)))
|
||||
.append(tableInfo.getWrapSchemaAndTableName(this)).append(" SET ");
|
||||
sql.append(UPDATE).append(forHint(CPI.getHint(queryWrapper)))
|
||||
.append(tableInfo.getWrapSchemaAndTableName(this)).append(SET);
|
||||
|
||||
StringJoiner stringJoiner = new StringJoiner(", ");
|
||||
StringJoiner stringJoiner = new StringJoiner(DELIMITER);
|
||||
|
||||
for (String modifyAttr : modifyAttrs) {
|
||||
stringJoiner.add(wrap(modifyAttr) + " = ?");
|
||||
stringJoiner.add(wrap(modifyAttr) + EQUALS_PLACEHOLDER);
|
||||
}
|
||||
|
||||
Map<String, String> onUpdateColumns = tableInfo.getOnUpdateColumns();
|
||||
if (onUpdateColumns != null && !onUpdateColumns.isEmpty()) {
|
||||
onUpdateColumns.forEach((column, value) -> stringJoiner.add(wrap(column) + " = " + value));
|
||||
onUpdateColumns.forEach((column, value) -> stringJoiner.add(wrap(column) + EQUALS + value));
|
||||
}
|
||||
|
||||
//乐观锁字段
|
||||
String versionColumn = tableInfo.getVersionColumn();
|
||||
if (StringUtil.isNotBlank(versionColumn)) {
|
||||
stringJoiner.add(wrap(versionColumn) + " = " + wrap(versionColumn) + " + 1 ");
|
||||
stringJoiner.add(wrap(versionColumn) + EQUALS + wrap(versionColumn) + " + 1 ");
|
||||
}
|
||||
|
||||
sql.append(stringJoiner);
|
||||
@ -685,12 +696,12 @@ public class CommonsDialectImpl implements IDialect {
|
||||
throw new IllegalArgumentException("Not allowed UPDATE a table without where condition.");
|
||||
}
|
||||
|
||||
sql.append(" WHERE ").append(whereConditionSql);
|
||||
sql.append(WHERE).append(whereConditionSql);
|
||||
|
||||
List<String> endFragments = CPI.getEndFragments(queryWrapper);
|
||||
if (CollectionUtil.isNotEmpty(endFragments)) {
|
||||
for (String endFragment : endFragments) {
|
||||
sql.append(" ").append(endFragment);
|
||||
sql.append(BLANK).append(endFragment);
|
||||
}
|
||||
}
|
||||
|
||||
@ -701,12 +712,12 @@ public class CommonsDialectImpl implements IDialect {
|
||||
@Override
|
||||
public String forUpdateNumberAddByQuery(String schema, String tableName, String fieldName, Number value, QueryWrapper queryWrapper) {
|
||||
StringBuilder sql = new StringBuilder();
|
||||
sql.append("UPDATE ").append(forHint(CPI.getHint(queryWrapper)));
|
||||
sql.append(UPDATE).append(forHint(CPI.getHint(queryWrapper)));
|
||||
if (StringUtil.isNotBlank(schema)) {
|
||||
sql.append(wrap(getRealSchema(schema))).append(".");
|
||||
sql.append(wrap(getRealSchema(schema))).append(REFERENCE);
|
||||
}
|
||||
sql.append(wrap(getRealTable(tableName))).append(" SET ");
|
||||
sql.append(wrap(fieldName)).append("=").append(wrap(fieldName)).append(geZero(value) ? " + " : " - ").append(abs(value));
|
||||
sql.append(wrap(getRealTable(tableName))).append(SET);
|
||||
sql.append(wrap(fieldName)).append(EQUALS).append(wrap(fieldName)).append(geZero(value) ? PLUS_SIGN : MINUS_SIGN).append(abs(value));
|
||||
|
||||
String whereConditionSql = buildWhereConditionSql(queryWrapper);
|
||||
|
||||
@ -715,12 +726,12 @@ public class CommonsDialectImpl implements IDialect {
|
||||
throw new IllegalArgumentException("Not allowed UPDATE a table without where condition.");
|
||||
}
|
||||
|
||||
sql.append(" WHERE ").append(whereConditionSql);
|
||||
sql.append(WHERE).append(whereConditionSql);
|
||||
|
||||
List<String> endFragments = CPI.getEndFragments(queryWrapper);
|
||||
if (CollectionUtil.isNotEmpty(endFragments)) {
|
||||
for (String endFragment : endFragments) {
|
||||
sql.append(" ").append(endFragment);
|
||||
sql.append(BLANK).append(endFragment);
|
||||
}
|
||||
}
|
||||
return sql.toString();
|
||||
@ -760,26 +771,26 @@ public class CommonsDialectImpl implements IDialect {
|
||||
@Override
|
||||
public String forSelectOneEntityById(TableInfo tableInfo) {
|
||||
StringBuilder sql = buildSelectColumnSql(null, null, null);
|
||||
sql.append(" FROM ").append(tableInfo.getWrapSchemaAndTableName(this));
|
||||
sql.append(" WHERE ");
|
||||
sql.append(FROM).append(tableInfo.getWrapSchemaAndTableName(this));
|
||||
sql.append(WHERE);
|
||||
String[] pKeys = tableInfo.getPrimaryKeys();
|
||||
for (int i = 0; i < pKeys.length; i++) {
|
||||
if (i > 0) {
|
||||
sql.append(" AND ");
|
||||
sql.append(AND);
|
||||
}
|
||||
sql.append(wrap(pKeys[i])).append(" = ?");
|
||||
sql.append(wrap(pKeys[i])).append(EQUALS_PLACEHOLDER);
|
||||
}
|
||||
|
||||
//逻辑删除的情况下,需要添加逻辑删除的条件
|
||||
String logicDeleteColumn = tableInfo.getLogicDeleteColumn();
|
||||
if (StringUtil.isNotBlank(logicDeleteColumn)) {
|
||||
sql.append(" AND ").append(wrap(logicDeleteColumn)).append(" = ").append(getLogicNormalValue());
|
||||
sql.append(AND).append(wrap(logicDeleteColumn)).append(EQUALS).append(getLogicNormalValue());
|
||||
}
|
||||
|
||||
//多租户
|
||||
Object[] tenantIdArgs = tableInfo.buildTenantIdArgs();
|
||||
if (ArrayUtil.isNotEmpty(tenantIdArgs)) {
|
||||
sql.append(" AND ").append(wrap(tableInfo.getTenantIdColumn())).append(" IN ").append(buildQuestion(tenantIdArgs.length, true));
|
||||
sql.append(AND).append(wrap(tableInfo.getTenantIdColumn())).append(IN).append(buildQuestion(tenantIdArgs.length));
|
||||
}
|
||||
|
||||
return sql.toString();
|
||||
@ -789,53 +800,53 @@ public class CommonsDialectImpl implements IDialect {
|
||||
@Override
|
||||
public String forSelectEntityListByIds(TableInfo tableInfo, Object[] primaryValues) {
|
||||
StringBuilder sql = buildSelectColumnSql(null, tableInfo.getDefaultQueryColumn(), null);
|
||||
sql.append(" FROM ").append(tableInfo.getWrapSchemaAndTableName(this));
|
||||
sql.append(" WHERE ");
|
||||
sql.append(FROM).append(tableInfo.getWrapSchemaAndTableName(this));
|
||||
sql.append(WHERE);
|
||||
String[] primaryKeys = tableInfo.getPrimaryKeys();
|
||||
|
||||
String logicDeleteColumn = tableInfo.getLogicDeleteColumn();
|
||||
Object[] tenantIdArgs = tableInfo.buildTenantIdArgs();
|
||||
if (StringUtil.isNotBlank(logicDeleteColumn) || ArrayUtil.isNotEmpty(tenantIdArgs)) {
|
||||
sql.append("(");
|
||||
sql.append(LEFT_BRACKET);
|
||||
}
|
||||
|
||||
//多主键的场景
|
||||
if (primaryKeys.length > 1) {
|
||||
for (int i = 0; i < primaryValues.length / primaryKeys.length; i++) {
|
||||
if (i > 0) {
|
||||
sql.append(" OR ");
|
||||
sql.append(OR);
|
||||
}
|
||||
sql.append("(");
|
||||
sql.append(LEFT_BRACKET);
|
||||
for (int j = 0; j < primaryKeys.length; j++) {
|
||||
if (j > 0) {
|
||||
sql.append(" AND ");
|
||||
sql.append(AND);
|
||||
}
|
||||
sql.append(wrap(primaryKeys[j])).append(" = ?");
|
||||
sql.append(wrap(primaryKeys[j])).append(EQUALS_PLACEHOLDER);
|
||||
}
|
||||
sql.append(")");
|
||||
sql.append(RIGHT_BRACKET);
|
||||
}
|
||||
}
|
||||
// 单主键
|
||||
else {
|
||||
for (int i = 0; i < primaryValues.length; i++) {
|
||||
if (i > 0) {
|
||||
sql.append(" OR ");
|
||||
sql.append(OR);
|
||||
}
|
||||
sql.append(wrap(primaryKeys[0])).append(" = ?");
|
||||
sql.append(wrap(primaryKeys[0])).append(EQUALS_PLACEHOLDER);
|
||||
}
|
||||
}
|
||||
|
||||
if (StringUtil.isNotBlank(logicDeleteColumn) || ArrayUtil.isNotEmpty(tenantIdArgs)) {
|
||||
sql.append(")");
|
||||
sql.append(RIGHT_BRACKET);
|
||||
}
|
||||
|
||||
|
||||
if (StringUtil.isNotBlank(logicDeleteColumn)) {
|
||||
sql.append(" AND ").append(wrap(logicDeleteColumn)).append(" = ").append(getLogicNormalValue());
|
||||
sql.append(AND).append(wrap(logicDeleteColumn)).append(EQUALS).append(getLogicNormalValue());
|
||||
}
|
||||
|
||||
if (ArrayUtil.isNotEmpty(tenantIdArgs)) {
|
||||
sql.append(" AND ").append(wrap(tableInfo.getTenantIdColumn())).append(" IN").append(buildQuestion(tenantIdArgs.length, true));
|
||||
sql.append(AND).append(wrap(tableInfo.getTenantIdColumn())).append(IN).append(buildQuestion(tenantIdArgs.length));
|
||||
}
|
||||
|
||||
return sql.toString();
|
||||
@ -860,7 +871,7 @@ public class CommonsDialectImpl implements IDialect {
|
||||
if (whereQueryCondition != null) {
|
||||
String whereSql = whereQueryCondition.toSql(queryTables, this);
|
||||
if (StringUtil.isNotBlank(whereSql)) {
|
||||
sqlBuilder.append(" WHERE ").append(whereSql);
|
||||
sqlBuilder.append(WHERE).append(whereSql);
|
||||
} else if (!allowNoCondition) {
|
||||
throw new IllegalArgumentException("Not allowed DELETE a table without where condition.");
|
||||
}
|
||||
@ -871,13 +882,13 @@ public class CommonsDialectImpl implements IDialect {
|
||||
protected void buildGroupBySql(StringBuilder sqlBuilder, QueryWrapper queryWrapper, List<QueryTable> queryTables) {
|
||||
List<QueryColumn> groupByColumns = CPI.getGroupByColumns(queryWrapper);
|
||||
if (groupByColumns != null && !groupByColumns.isEmpty()) {
|
||||
sqlBuilder.append(" GROUP BY ");
|
||||
sqlBuilder.append(GROUP_BY);
|
||||
int index = 0;
|
||||
for (QueryColumn groupByColumn : groupByColumns) {
|
||||
String groupBy = CPI.toConditionSql(groupByColumn, queryTables, this);
|
||||
sqlBuilder.append(groupBy);
|
||||
if (index != groupByColumns.size() - 1) {
|
||||
sqlBuilder.append(", ");
|
||||
sqlBuilder.append(DELIMITER);
|
||||
}
|
||||
index++;
|
||||
}
|
||||
@ -890,7 +901,7 @@ public class CommonsDialectImpl implements IDialect {
|
||||
if (havingQueryCondition != null) {
|
||||
String havingSql = havingQueryCondition.toSql(queryTables, this);
|
||||
if (StringUtil.isNotBlank(havingSql)) {
|
||||
sqlBuilder.append(" HAVING ").append(havingSql);
|
||||
sqlBuilder.append(HAVING).append(havingSql);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -899,12 +910,12 @@ public class CommonsDialectImpl implements IDialect {
|
||||
protected void buildOrderBySql(StringBuilder sqlBuilder, QueryWrapper queryWrapper, List<QueryTable> queryTables) {
|
||||
List<QueryOrderBy> orderBys = CPI.getOrderBys(queryWrapper);
|
||||
if (orderBys != null && !orderBys.isEmpty()) {
|
||||
sqlBuilder.append(" ORDER BY ");
|
||||
sqlBuilder.append(ORDER_BY);
|
||||
int index = 0;
|
||||
for (QueryOrderBy orderBy : orderBys) {
|
||||
sqlBuilder.append(orderBy.toSql(queryTables, this));
|
||||
if (index != orderBys.size() - 1) {
|
||||
sqlBuilder.append(", ");
|
||||
sqlBuilder.append(DELIMITER);
|
||||
}
|
||||
index++;
|
||||
}
|
||||
@ -920,15 +931,16 @@ public class CommonsDialectImpl implements IDialect {
|
||||
}
|
||||
|
||||
|
||||
protected String buildQuestion(int count, boolean withBrackets) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
protected String buildQuestion(int count) {
|
||||
StringBuilder sb = new StringBuilder(LEFT_BRACKET);
|
||||
for (int i = 0; i < count; i++) {
|
||||
sb.append("?");
|
||||
sb.append(PLACEHOLDER);
|
||||
if (i != count - 1) {
|
||||
sb.append(", ");
|
||||
sb.append(DELIMITER);
|
||||
}
|
||||
}
|
||||
return withBrackets ? "(" + sb + ")" : sb.toString();
|
||||
sb.append(RIGHT_BRACKET);
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
|
||||
@ -938,7 +950,7 @@ public class CommonsDialectImpl implements IDialect {
|
||||
|| normalValueOfLogicDelete instanceof Boolean) {
|
||||
return normalValueOfLogicDelete;
|
||||
}
|
||||
return "'" + normalValueOfLogicDelete + "'";
|
||||
return SINGLE_QUOTE + normalValueOfLogicDelete + SINGLE_QUOTE;
|
||||
}
|
||||
|
||||
|
||||
@ -948,7 +960,7 @@ public class CommonsDialectImpl implements IDialect {
|
||||
|| deletedValueOfLogicDelete instanceof Boolean) {
|
||||
return deletedValueOfLogicDelete;
|
||||
}
|
||||
return "'" + deletedValueOfLogicDelete + "'";
|
||||
return SINGLE_QUOTE + deletedValueOfLogicDelete + SINGLE_QUOTE;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
/**
|
||||
/*
|
||||
* Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com).
|
||||
* <p>
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@ -15,6 +15,7 @@
|
||||
*/
|
||||
package com.mybatisflex.core.dialect.impl;
|
||||
|
||||
import com.mybatisflex.core.constant.SqlConsts;
|
||||
import com.mybatisflex.core.dialect.KeywordWrap;
|
||||
import com.mybatisflex.core.dialect.LimitOffsetProcessor;
|
||||
import com.mybatisflex.core.row.Row;
|
||||
@ -27,6 +28,8 @@ import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.StringJoiner;
|
||||
|
||||
import static com.mybatisflex.core.constant.SqlConsts.*;
|
||||
|
||||
public class OracleDialect extends CommonsDialectImpl {
|
||||
|
||||
private static final Set<String> keywords = CollectionUtil.newHashSet(
|
||||
@ -80,7 +83,7 @@ public class OracleDialect extends CommonsDialectImpl {
|
||||
* SELECT 1 FROM DUAL;
|
||||
*/
|
||||
StringBuilder sql = new StringBuilder();
|
||||
sql.append("INSERT ALL");
|
||||
sql.append(INSERT_ALL);
|
||||
String[] insertColumns = tableInfo.obtainInsertColumns(null, false);
|
||||
String[] warpedInsertColumns = new String[insertColumns.length];
|
||||
for (int i = 0; i < insertColumns.length; i++) {
|
||||
@ -90,23 +93,23 @@ public class OracleDialect extends CommonsDialectImpl {
|
||||
|
||||
Map<String, String> onInsertColumns = tableInfo.getOnInsertColumns();
|
||||
for (int i = 0; i < entities.size(); i++) {
|
||||
sql.append(" INTO ").append(tableInfo.getWrapSchemaAndTableName(this));
|
||||
sql.append(" (").append(StringUtil.join(", ", warpedInsertColumns)).append(")");
|
||||
sql.append(" VALUES ");
|
||||
sql.append(INTO).append(tableInfo.getWrapSchemaAndTableName(this));
|
||||
sql.append(BLANK).append(LEFT_BRACKET).append(StringUtil.join(DELIMITER, warpedInsertColumns)).append(RIGHT_BRACKET);
|
||||
sql.append(VALUES);
|
||||
|
||||
StringJoiner stringJoiner = new StringJoiner(", ", "(", ")");
|
||||
StringJoiner stringJoiner = new StringJoiner(DELIMITER, LEFT_BRACKET, RIGHT_BRACKET);
|
||||
for (String insertColumn : insertColumns) {
|
||||
if (onInsertColumns != null && onInsertColumns.containsKey(insertColumn)) {
|
||||
//直接读取 onInsert 配置的值,而不用 "?" 代替
|
||||
stringJoiner.add(onInsertColumns.get(insertColumn));
|
||||
} else {
|
||||
stringJoiner.add("?");
|
||||
stringJoiner.add(PLACEHOLDER);
|
||||
}
|
||||
}
|
||||
sql.append(stringJoiner);
|
||||
}
|
||||
|
||||
return sql.append(" SELECT 1 FROM DUAL").toString();
|
||||
return sql.append(INSERT_ALL_END).toString();
|
||||
}
|
||||
|
||||
|
||||
@ -129,25 +132,25 @@ public class OracleDialect extends CommonsDialectImpl {
|
||||
for (String column : attrs) {
|
||||
fields.append(wrap(column));
|
||||
if (index != attrs.size() - 1) {
|
||||
fields.append(", ");
|
||||
fields.append(SqlConsts.DELIMITER);
|
||||
}
|
||||
index++;
|
||||
}
|
||||
|
||||
StringBuilder sql = new StringBuilder();
|
||||
sql.append("INSERT ALL");
|
||||
sql.append(INSERT_ALL);
|
||||
|
||||
String tableNameWrap = StringUtil.isNotBlank(schema)
|
||||
? wrap(getRealSchema(schema)) + "." + wrap(getRealTable(tableName))
|
||||
? wrap(getRealSchema(schema)) + REFERENCE + wrap(getRealTable(tableName))
|
||||
: wrap(getRealTable(tableName));
|
||||
String questionStrings = buildQuestion(attrs.size(), true);
|
||||
String questionStrings = buildQuestion(attrs.size());
|
||||
|
||||
for (int i = 0; i < rows.size(); i++) {
|
||||
sql.append(" INTO ").append(tableNameWrap);
|
||||
sql.append(" (").append(fields).append(")");
|
||||
sql.append(" VALUES ").append(questionStrings);
|
||||
sql.append(INTO).append(tableNameWrap);
|
||||
sql.append(BLANK).append(LEFT_BRACKET).append(fields).append(RIGHT_BRACKET);
|
||||
sql.append(VALUES).append(questionStrings);
|
||||
}
|
||||
|
||||
return sql.append(" SELECT 1 FROM DUAL").toString();
|
||||
return sql.append(INSERT_ALL_END).toString();
|
||||
}
|
||||
}
|
||||
|
||||
@ -15,6 +15,7 @@
|
||||
*/
|
||||
package com.mybatisflex.core.query;
|
||||
|
||||
import com.mybatisflex.core.constant.SqlConsts;
|
||||
import com.mybatisflex.core.dialect.IDialect;
|
||||
import com.mybatisflex.core.exception.FlexExceptions;
|
||||
import com.mybatisflex.core.util.CollectionUtil;
|
||||
@ -23,6 +24,8 @@ import com.mybatisflex.core.util.StringUtil;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import static com.mybatisflex.core.constant.SqlConsts.*;
|
||||
|
||||
public class ArithmeticQueryColumn extends QueryColumn {
|
||||
|
||||
private List<ArithmeticInfo> arithmeticInfos;
|
||||
@ -34,49 +37,49 @@ public class ArithmeticQueryColumn extends QueryColumn {
|
||||
|
||||
@Override
|
||||
public QueryColumn add(QueryColumn queryColumn) {
|
||||
arithmeticInfos.add(new ArithmeticInfo(" + ", queryColumn));
|
||||
arithmeticInfos.add(new ArithmeticInfo(PLUS_SIGN, queryColumn));
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public QueryColumn add(Number number) {
|
||||
arithmeticInfos.add(new ArithmeticInfo(" + ", number));
|
||||
arithmeticInfos.add(new ArithmeticInfo(PLUS_SIGN, number));
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public QueryColumn subtract(QueryColumn queryColumn) {
|
||||
arithmeticInfos.add(new ArithmeticInfo(" - ", queryColumn));
|
||||
arithmeticInfos.add(new ArithmeticInfo(MINUS_SIGN, queryColumn));
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public QueryColumn subtract(Number number) {
|
||||
arithmeticInfos.add(new ArithmeticInfo(" - ", number));
|
||||
arithmeticInfos.add(new ArithmeticInfo(MINUS_SIGN, number));
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public QueryColumn multiply(QueryColumn queryColumn) {
|
||||
arithmeticInfos.add(new ArithmeticInfo(" * ", queryColumn));
|
||||
arithmeticInfos.add(new ArithmeticInfo(MULTIPLICATION_SIGN, queryColumn));
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public QueryColumn multiply(Number number) {
|
||||
arithmeticInfos.add(new ArithmeticInfo(" * ", number));
|
||||
arithmeticInfos.add(new ArithmeticInfo(MULTIPLICATION_SIGN, number));
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public QueryColumn divide(QueryColumn queryColumn) {
|
||||
arithmeticInfos.add(new ArithmeticInfo(" / ", queryColumn));
|
||||
arithmeticInfos.add(new ArithmeticInfo(DIVISION_SIGN, queryColumn));
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public QueryColumn divide(Number number) {
|
||||
arithmeticInfos.add(new ArithmeticInfo(" / ", number));
|
||||
arithmeticInfos.add(new ArithmeticInfo(DIVISION_SIGN, number));
|
||||
return this;
|
||||
}
|
||||
|
||||
@ -93,7 +96,7 @@ public class ArithmeticQueryColumn extends QueryColumn {
|
||||
sql.append(arithmeticInfos.get(i).toSql(queryTables, dialect, i));
|
||||
}
|
||||
if (StringUtil.isNotBlank(alias)) {
|
||||
return "(" + sql + ") AS " + dialect.wrap(alias);
|
||||
return WrapperUtil.withAlias(sql.toString(), dialect.wrap(alias));
|
||||
}
|
||||
return sql.toString();
|
||||
}
|
||||
@ -113,7 +116,7 @@ public class ArithmeticQueryColumn extends QueryColumn {
|
||||
for (int i = 0; i < arithmeticInfos.size(); i++) {
|
||||
sql.append(arithmeticInfos.get(i).toSql(queryTables, dialect, i));
|
||||
}
|
||||
return "(" + sql + ")";
|
||||
return SqlConsts.LEFT_BRACKET + sql + SqlConsts.RIGHT_BRACKET;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -16,10 +16,14 @@
|
||||
package com.mybatisflex.core.query;
|
||||
|
||||
import com.mybatisflex.core.FlexConsts;
|
||||
import com.mybatisflex.core.constant.SqlConsts;
|
||||
import com.mybatisflex.core.dialect.DialectFactory;
|
||||
import com.mybatisflex.core.dialect.IDialect;
|
||||
import com.mybatisflex.core.exception.FlexExceptions;
|
||||
import com.mybatisflex.core.util.*;
|
||||
import com.mybatisflex.core.util.ArrayUtil;
|
||||
import com.mybatisflex.core.util.CollectionUtil;
|
||||
import com.mybatisflex.core.util.ObjectUtil;
|
||||
import com.mybatisflex.core.util.StringUtil;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@ -39,17 +43,17 @@ public class CaseQueryColumn extends QueryColumn implements HasParamsColumn {
|
||||
|
||||
@Override
|
||||
String toSelectSql(List<QueryTable> queryTables, IDialect dialect) {
|
||||
StringBuilder sql = new StringBuilder("CASE");
|
||||
StringBuilder sql = new StringBuilder(SqlConsts.CASE);
|
||||
for (When when : whens) {
|
||||
sql.append(" WHEN ").append(when.whenCondition.toSql(queryTables, dialect));
|
||||
sql.append(" THEN ").append(buildValue(when.thenValue));
|
||||
sql.append(SqlConsts.WHEN).append(when.whenCondition.toSql(queryTables, dialect));
|
||||
sql.append(SqlConsts.THEN).append(buildValue(when.thenValue));
|
||||
}
|
||||
if (elseValue != null) {
|
||||
sql.append(" ELSE ").append(buildValue(elseValue));
|
||||
sql.append(SqlConsts.ELSE).append(buildValue(elseValue));
|
||||
}
|
||||
sql.append(" END");
|
||||
sql.append(SqlConsts.END);
|
||||
if (StringUtil.isNotBlank(alias)) {
|
||||
return "(" + sql + ") AS " + dialect.wrap(alias);
|
||||
return WrapperUtil.withAlias(sql.toString(), dialect.wrap(alias));
|
||||
}
|
||||
return sql.toString();
|
||||
}
|
||||
@ -65,16 +69,16 @@ public class CaseQueryColumn extends QueryColumn implements HasParamsColumn {
|
||||
|
||||
@Override
|
||||
String toConditionSql(List<QueryTable> queryTables, IDialect dialect) {
|
||||
StringBuilder sql = new StringBuilder("CASE");
|
||||
StringBuilder sql = new StringBuilder(SqlConsts.CASE);
|
||||
for (When when : whens) {
|
||||
sql.append(" WHEN ").append(when.whenCondition.toSql(queryTables, dialect));
|
||||
sql.append(" THEN ").append(buildValue(when.thenValue));
|
||||
sql.append(SqlConsts.WHEN).append(when.whenCondition.toSql(queryTables, dialect));
|
||||
sql.append(SqlConsts.THEN).append(buildValue(when.thenValue));
|
||||
}
|
||||
if (elseValue != null) {
|
||||
sql.append(" ELSE ").append(buildValue(elseValue));
|
||||
sql.append(SqlConsts.ELSE).append(buildValue(elseValue));
|
||||
}
|
||||
sql.append(" END");
|
||||
return "(" + sql + ")";
|
||||
sql.append(SqlConsts.END);
|
||||
return WrapperUtil.withBracket(sql.toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -16,10 +16,14 @@
|
||||
package com.mybatisflex.core.query;
|
||||
|
||||
import com.mybatisflex.core.FlexConsts;
|
||||
import com.mybatisflex.core.constant.SqlConsts;
|
||||
import com.mybatisflex.core.dialect.DialectFactory;
|
||||
import com.mybatisflex.core.dialect.IDialect;
|
||||
import com.mybatisflex.core.exception.FlexExceptions;
|
||||
import com.mybatisflex.core.util.*;
|
||||
import com.mybatisflex.core.util.ArrayUtil;
|
||||
import com.mybatisflex.core.util.CollectionUtil;
|
||||
import com.mybatisflex.core.util.ObjectUtil;
|
||||
import com.mybatisflex.core.util.StringUtil;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@ -32,17 +36,17 @@ public class CaseSearchQueryColumn extends QueryColumn implements HasParamsColum
|
||||
|
||||
@Override
|
||||
String toSelectSql(List<QueryTable> queryTables, IDialect dialect) {
|
||||
StringBuilder sql = new StringBuilder("CASE ");
|
||||
sql.append(queryColumn.toSelectSql(queryTables, dialect));
|
||||
StringBuilder sql = new StringBuilder(SqlConsts.CASE);
|
||||
sql.append(SqlConsts.BLANK).append(queryColumn.toSelectSql(queryTables, dialect));
|
||||
for (When when : whens) {
|
||||
sql.append(" WHEN ").append(buildValue(when.searchValue)).append(" THEN ").append(buildValue(when.thenValue));
|
||||
sql.append(SqlConsts.WHEN).append(buildValue(when.searchValue)).append(" THEN ").append(buildValue(when.thenValue));
|
||||
}
|
||||
if (elseValue != null) {
|
||||
sql.append(" ELSE ").append(buildValue(elseValue));
|
||||
sql.append(SqlConsts.ELSE).append(buildValue(elseValue));
|
||||
}
|
||||
sql.append(" END");
|
||||
sql.append(SqlConsts.END);
|
||||
if (StringUtil.isNotBlank(alias)) {
|
||||
return "(" + sql + ") AS " + dialect.wrap(alias);
|
||||
return WrapperUtil.withAlias(sql.toString(), dialect.wrap(alias));
|
||||
}
|
||||
return sql.toString();
|
||||
}
|
||||
@ -59,16 +63,17 @@ public class CaseSearchQueryColumn extends QueryColumn implements HasParamsColum
|
||||
|
||||
@Override
|
||||
String toConditionSql(List<QueryTable> queryTables, IDialect dialect) {
|
||||
StringBuilder sql = new StringBuilder("CASE ");
|
||||
sql.append(queryColumn.toSelectSql(queryTables, dialect));
|
||||
StringBuilder sql = new StringBuilder(SqlConsts.CASE);
|
||||
sql.append(SqlConsts.BLANK).append(queryColumn.toSelectSql(queryTables, dialect));
|
||||
for (When when : whens) {
|
||||
sql.append(" WHEN ").append(buildValue(when.searchValue)).append(" THEN ").append(buildValue(when.thenValue));
|
||||
sql.append(SqlConsts.WHEN).append(buildValue(when.searchValue));
|
||||
sql.append(SqlConsts.THEN).append(buildValue(when.thenValue));
|
||||
}
|
||||
if (elseValue != null) {
|
||||
sql.append(" ELSE ").append(buildValue(elseValue));
|
||||
sql.append(SqlConsts.ELSE).append(buildValue(elseValue));
|
||||
}
|
||||
sql.append(" END");
|
||||
return "(" + sql + ")";
|
||||
sql.append(SqlConsts.END);
|
||||
return WrapperUtil.withBracket(sql.toString());
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -15,6 +15,7 @@
|
||||
*/
|
||||
package com.mybatisflex.core.query;
|
||||
|
||||
import com.mybatisflex.core.constant.SqlConsts;
|
||||
import com.mybatisflex.core.dialect.IDialect;
|
||||
import com.mybatisflex.core.util.CollectionUtil;
|
||||
import com.mybatisflex.core.util.StringUtil;
|
||||
@ -32,9 +33,9 @@ public class DistinctQueryColumn extends QueryColumn {
|
||||
@Override
|
||||
public String toSelectSql(List<QueryTable> queryTables, IDialect dialect) {
|
||||
if (CollectionUtil.isEmpty(queryTables)) {
|
||||
return "";
|
||||
return SqlConsts.EMPTY;
|
||||
}
|
||||
return "DISTINCT " + StringUtil.join(", ", queryColumns, queryColumn ->
|
||||
return SqlConsts.DISTINCT + StringUtil.join(SqlConsts.DELIMITER, queryColumns, queryColumn ->
|
||||
queryColumn.toSelectSql(queryTables, dialect));
|
||||
}
|
||||
|
||||
|
||||
@ -16,6 +16,7 @@
|
||||
package com.mybatisflex.core.query;
|
||||
|
||||
import com.mybatisflex.core.FlexConsts;
|
||||
import com.mybatisflex.core.constant.SqlConsts;
|
||||
import com.mybatisflex.core.dialect.IDialect;
|
||||
import com.mybatisflex.core.util.ObjectUtil;
|
||||
import com.mybatisflex.core.util.SqlUtil;
|
||||
@ -71,7 +72,13 @@ public class FunctionQueryColumn extends QueryColumn implements HasParamsColumn
|
||||
@Override
|
||||
public String toSelectSql(List<QueryTable> queryTables, IDialect dialect) {
|
||||
String sql = column.toSelectSql(queryTables, dialect);
|
||||
return StringUtil.isBlank(sql) ? "" : fnName + "(" + sql + ")" + WrapperUtil.buildAsAlias(alias, dialect);
|
||||
if (StringUtil.isBlank(sql)) {
|
||||
return SqlConsts.EMPTY;
|
||||
}
|
||||
if (StringUtil.isBlank(alias)) {
|
||||
return fnName + WrapperUtil.withBracket(sql);
|
||||
}
|
||||
return fnName + WrapperUtil.withAlias(sql, dialect.wrap(alias));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -15,6 +15,7 @@
|
||||
*/
|
||||
package com.mybatisflex.core.query;
|
||||
|
||||
import com.mybatisflex.core.constant.SqlConsts;
|
||||
import com.mybatisflex.core.dialect.IDialect;
|
||||
import com.mybatisflex.core.exception.FlexExceptions;
|
||||
import com.mybatisflex.core.util.ObjectUtil;
|
||||
@ -31,13 +32,6 @@ public class Join implements CloneSupport<Join> {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
public static final String TYPE_JOIN = " JOIN ";
|
||||
public static final String TYPE_LEFT = " LEFT JOIN ";
|
||||
public static final String TYPE_RIGHT = " RIGHT JOIN ";
|
||||
public static final String TYPE_INNER = " INNER JOIN ";
|
||||
public static final String TYPE_FULL = " FULL JOIN ";
|
||||
public static final String TYPE_CROSS = " CROSS JOIN ";
|
||||
|
||||
|
||||
protected final String type;
|
||||
protected QueryTable queryTable;
|
||||
@ -90,7 +84,7 @@ public class Join implements CloneSupport<Join> {
|
||||
//left join xxx as xxx2 on xxx2.id = xxx3.other
|
||||
List<QueryTable> newQueryTables = new ArrayList<>(queryTables);
|
||||
newQueryTables.add(queryTable);
|
||||
sql.append(" ON ").append(on.toSql(newQueryTables, dialect));
|
||||
sql.append(SqlConsts.ON).append(on.toSql(newQueryTables, dialect));
|
||||
return sql.toString();
|
||||
}
|
||||
|
||||
|
||||
@ -15,6 +15,7 @@
|
||||
*/
|
||||
package com.mybatisflex.core.query;
|
||||
|
||||
import com.mybatisflex.core.constant.SqlConsts;
|
||||
import com.mybatisflex.core.dialect.IDialect;
|
||||
import com.mybatisflex.core.util.ObjectUtil;
|
||||
import com.mybatisflex.core.util.StringUtil;
|
||||
@ -47,7 +48,10 @@ public class OperatorQueryCondition extends QueryCondition {
|
||||
if (prevEffectiveCondition != null) {
|
||||
sql.append(prevEffectiveCondition.connector);
|
||||
}
|
||||
sql.append(operator).append("(").append(childSql).append(")");
|
||||
sql.append(operator)
|
||||
.append(SqlConsts.LEFT_BRACKET)
|
||||
.append(childSql)
|
||||
.append(SqlConsts.RIGHT_BRACKET);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -15,6 +15,7 @@
|
||||
*/
|
||||
package com.mybatisflex.core.query;
|
||||
|
||||
import com.mybatisflex.core.constant.SqlConsts;
|
||||
import com.mybatisflex.core.dialect.IDialect;
|
||||
import com.mybatisflex.core.util.ObjectUtil;
|
||||
import com.mybatisflex.core.util.StringUtil;
|
||||
@ -49,7 +50,10 @@ public class OperatorSelectCondition extends QueryCondition {
|
||||
if (prevEffectiveCondition != null) {
|
||||
sql.append(prevEffectiveCondition.connector);
|
||||
}
|
||||
sql.append(operator).append("(").append(childSql).append(")");
|
||||
sql.append(operator)
|
||||
.append(SqlConsts.LEFT_BRACKET)
|
||||
.append(childSql)
|
||||
.append(SqlConsts.RIGHT_BRACKET);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -16,6 +16,7 @@
|
||||
package com.mybatisflex.core.query;
|
||||
|
||||
|
||||
import com.mybatisflex.core.constant.SqlConsts;
|
||||
import com.mybatisflex.core.dialect.IDialect;
|
||||
import com.mybatisflex.core.exception.FlexExceptions;
|
||||
import com.mybatisflex.core.table.TableDef;
|
||||
@ -111,7 +112,7 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
|
||||
if (value == null) {
|
||||
return QueryCondition.createEmpty();
|
||||
}
|
||||
return QueryCondition.create(this, QueryCondition.LOGIC_EQUALS, value);
|
||||
return QueryCondition.create(this, SqlConsts.EQUALS, value);
|
||||
}
|
||||
|
||||
|
||||
@ -119,7 +120,7 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
|
||||
if (value == null) {
|
||||
return QueryCondition.createEmpty();
|
||||
}
|
||||
return QueryCondition.create(this, QueryCondition.LOGIC_EQUALS, value).when(fn);
|
||||
return QueryCondition.create(this, SqlConsts.EQUALS, value).when(fn);
|
||||
}
|
||||
|
||||
|
||||
@ -132,14 +133,14 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
|
||||
if (value == null) {
|
||||
return QueryCondition.createEmpty();
|
||||
}
|
||||
return QueryCondition.create(this, QueryCondition.LOGIC_NOT_EQUALS, value);
|
||||
return QueryCondition.create(this, SqlConsts.NOT_EQUALS, value);
|
||||
}
|
||||
|
||||
public <T> QueryCondition ne(Object value, Predicate<T> fn) {
|
||||
if (value == null) {
|
||||
return QueryCondition.createEmpty();
|
||||
}
|
||||
return QueryCondition.create(this, QueryCondition.LOGIC_NOT_EQUALS, value).when(fn);
|
||||
return QueryCondition.create(this, SqlConsts.NOT_EQUALS, value).when(fn);
|
||||
}
|
||||
|
||||
|
||||
@ -152,14 +153,14 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
|
||||
if (value == null) {
|
||||
return QueryCondition.createEmpty();
|
||||
}
|
||||
return QueryCondition.create(this, QueryCondition.LOGIC_LIKE, "%" + value + "%");
|
||||
return QueryCondition.create(this, SqlConsts.LIKE, "%" + value + "%");
|
||||
}
|
||||
|
||||
public <T> QueryCondition like(Object value, Predicate<T> fn) {
|
||||
if (value == null) {
|
||||
return QueryCondition.createEmpty();
|
||||
}
|
||||
return QueryCondition.create(this, QueryCondition.LOGIC_LIKE, "%" + value + "%").when(fn);
|
||||
return QueryCondition.create(this, SqlConsts.LIKE, "%" + value + "%").when(fn);
|
||||
}
|
||||
|
||||
|
||||
@ -167,14 +168,14 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
|
||||
if (value == null) {
|
||||
return QueryCondition.createEmpty();
|
||||
}
|
||||
return QueryCondition.create(this, QueryCondition.LOGIC_LIKE, value + "%");
|
||||
return QueryCondition.create(this, SqlConsts.LIKE, value + "%");
|
||||
}
|
||||
|
||||
public <T> QueryCondition likeLeft(Object value, Predicate<T> fn) {
|
||||
if (value == null) {
|
||||
return QueryCondition.createEmpty();
|
||||
}
|
||||
return QueryCondition.create(this, QueryCondition.LOGIC_LIKE, value + "%").when(fn);
|
||||
return QueryCondition.create(this, SqlConsts.LIKE, value + "%").when(fn);
|
||||
}
|
||||
|
||||
|
||||
@ -182,14 +183,14 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
|
||||
if (value == null) {
|
||||
return QueryCondition.createEmpty();
|
||||
}
|
||||
return QueryCondition.create(this, QueryCondition.LOGIC_LIKE, "%" + value);
|
||||
return QueryCondition.create(this, SqlConsts.LIKE, "%" + value);
|
||||
}
|
||||
|
||||
public <T> QueryCondition likeRight(Object value, Predicate<T> fn) {
|
||||
if (value == null) {
|
||||
return QueryCondition.createEmpty();
|
||||
}
|
||||
return QueryCondition.create(this, QueryCondition.LOGIC_LIKE, "%" + value).when(fn);
|
||||
return QueryCondition.create(this, SqlConsts.LIKE, "%" + value).when(fn);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -201,14 +202,14 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
|
||||
if (value == null) {
|
||||
return QueryCondition.createEmpty();
|
||||
}
|
||||
return QueryCondition.create(this, QueryCondition.LOGIC_GT, value);
|
||||
return QueryCondition.create(this, SqlConsts.GT, value);
|
||||
}
|
||||
|
||||
public <T> QueryCondition gt(Object value, Predicate<T> fn) {
|
||||
if (value == null) {
|
||||
return QueryCondition.createEmpty();
|
||||
}
|
||||
return QueryCondition.create(this, QueryCondition.LOGIC_GT, value).when(fn);
|
||||
return QueryCondition.create(this, SqlConsts.GT, value).when(fn);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -220,14 +221,14 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
|
||||
if (value == null) {
|
||||
return QueryCondition.createEmpty();
|
||||
}
|
||||
return QueryCondition.create(this, QueryCondition.LOGIC_GE, value);
|
||||
return QueryCondition.create(this, SqlConsts.GE, value);
|
||||
}
|
||||
|
||||
public <T> QueryCondition ge(Object value, Predicate<T> fn) {
|
||||
if (value == null) {
|
||||
return QueryCondition.createEmpty();
|
||||
}
|
||||
return QueryCondition.create(this, QueryCondition.LOGIC_GE, value).when(fn);
|
||||
return QueryCondition.create(this, SqlConsts.GE, value).when(fn);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -239,14 +240,14 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
|
||||
if (value == null) {
|
||||
return QueryCondition.createEmpty();
|
||||
}
|
||||
return QueryCondition.create(this, QueryCondition.LOGIC_LT, value);
|
||||
return QueryCondition.create(this, SqlConsts.LT, value);
|
||||
}
|
||||
|
||||
public <T> QueryCondition lt(Object value, Predicate<T> fn) {
|
||||
if (value == null) {
|
||||
return QueryCondition.createEmpty();
|
||||
}
|
||||
return QueryCondition.create(this, QueryCondition.LOGIC_LT, value).when(fn);
|
||||
return QueryCondition.create(this, SqlConsts.LT, value).when(fn);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -258,14 +259,14 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
|
||||
if (value == null) {
|
||||
return QueryCondition.createEmpty();
|
||||
}
|
||||
return QueryCondition.create(this, QueryCondition.LOGIC_LE, value);
|
||||
return QueryCondition.create(this, SqlConsts.LE, value);
|
||||
}
|
||||
|
||||
public <T> QueryCondition le(Object value, Predicate<T> fn) {
|
||||
if (value == null) {
|
||||
return QueryCondition.createEmpty();
|
||||
}
|
||||
return QueryCondition.create(this, QueryCondition.LOGIC_LE, value).when(fn);
|
||||
return QueryCondition.create(this, SqlConsts.LE, value).when(fn);
|
||||
}
|
||||
|
||||
|
||||
@ -275,11 +276,11 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
|
||||
* @return
|
||||
*/
|
||||
public QueryCondition isNull() {
|
||||
return QueryCondition.create(this, QueryCondition.LOGIC_IS_NULL, null);
|
||||
return QueryCondition.create(this, SqlConsts.IS_NULL, null);
|
||||
}
|
||||
|
||||
public <T> QueryCondition isNull(Predicate<T> fn) {
|
||||
return QueryCondition.create(this, QueryCondition.LOGIC_IS_NULL, null).when(fn);
|
||||
return QueryCondition.create(this, SqlConsts.IS_NULL, null).when(fn);
|
||||
}
|
||||
|
||||
|
||||
@ -289,11 +290,11 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
|
||||
* @return
|
||||
*/
|
||||
public QueryCondition isNotNull() {
|
||||
return QueryCondition.create(this, QueryCondition.LOGIC_IS_NOT_NULL, null);
|
||||
return QueryCondition.create(this, SqlConsts.IS_NOT_NULL, null);
|
||||
}
|
||||
|
||||
public <T> QueryCondition isNotNull(Predicate<T> fn) {
|
||||
return QueryCondition.create(this, QueryCondition.LOGIC_IS_NOT_NULL, null).when(fn);
|
||||
return QueryCondition.create(this, SqlConsts.IS_NOT_NULL, null).when(fn);
|
||||
}
|
||||
|
||||
|
||||
@ -308,7 +309,7 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
|
||||
if (arrays == null || arrays.length == 0 || (arrays.length == 1 && arrays[0] == null)) {
|
||||
return QueryCondition.createEmpty();
|
||||
}
|
||||
return QueryCondition.create(this, QueryCondition.LOGIC_IN, arrays);
|
||||
return QueryCondition.create(this, SqlConsts.IN, arrays);
|
||||
}
|
||||
|
||||
public <T> QueryCondition in(Object[] arrays, Predicate<T> fn) {
|
||||
@ -316,7 +317,7 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
|
||||
if (arrays == null || arrays.length == 0 || (arrays.length == 1 && arrays[0] == null)) {
|
||||
return QueryCondition.createEmpty();
|
||||
}
|
||||
return QueryCondition.create(this, QueryCondition.LOGIC_IN, arrays).when(fn);
|
||||
return QueryCondition.create(this, SqlConsts.IN, arrays).when(fn);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -326,11 +327,11 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
|
||||
* @return
|
||||
*/
|
||||
public QueryCondition in(QueryWrapper queryWrapper) {
|
||||
return QueryCondition.create(this, QueryCondition.LOGIC_IN, queryWrapper);
|
||||
return QueryCondition.create(this, SqlConsts.IN, queryWrapper);
|
||||
}
|
||||
|
||||
public <T> QueryCondition in(QueryWrapper queryWrapper, Predicate<T> fn) {
|
||||
return QueryCondition.create(this, QueryCondition.LOGIC_IN, queryWrapper).when(fn);
|
||||
return QueryCondition.create(this, SqlConsts.IN, queryWrapper).when(fn);
|
||||
}
|
||||
|
||||
|
||||
@ -365,7 +366,7 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
|
||||
if (arrays == null || arrays.length == 0 || (arrays.length == 1 && arrays[0] == null)) {
|
||||
return QueryCondition.createEmpty();
|
||||
}
|
||||
return QueryCondition.create(this, QueryCondition.LOGIC_NOT_IN, arrays);
|
||||
return QueryCondition.create(this, SqlConsts.NOT_IN, arrays);
|
||||
}
|
||||
|
||||
public <T> QueryCondition notIn(Object[] arrays, Predicate<T> fn) {
|
||||
@ -373,7 +374,7 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
|
||||
if (arrays == null || arrays.length == 0 || (arrays.length == 1 && arrays[0] == null)) {
|
||||
return QueryCondition.createEmpty();
|
||||
}
|
||||
return QueryCondition.create(this, QueryCondition.LOGIC_NOT_IN, arrays).when(fn);
|
||||
return QueryCondition.create(this, SqlConsts.NOT_IN, arrays).when(fn);
|
||||
}
|
||||
|
||||
|
||||
@ -403,11 +404,11 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
|
||||
* @param queryWrapper
|
||||
*/
|
||||
public QueryCondition notIn(QueryWrapper queryWrapper) {
|
||||
return QueryCondition.create(this, QueryCondition.LOGIC_NOT_IN, queryWrapper);
|
||||
return QueryCondition.create(this, SqlConsts.NOT_IN, queryWrapper);
|
||||
}
|
||||
|
||||
public <T> QueryCondition notIn(QueryWrapper queryWrapper, Predicate<T> fn) {
|
||||
return QueryCondition.create(this, QueryCondition.LOGIC_NOT_IN, queryWrapper).when(fn);
|
||||
return QueryCondition.create(this, SqlConsts.NOT_IN, queryWrapper).when(fn);
|
||||
}
|
||||
|
||||
|
||||
@ -418,11 +419,11 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
|
||||
* @param end
|
||||
*/
|
||||
public QueryCondition between(Object start, Object end) {
|
||||
return QueryCondition.create(this, QueryCondition.LOGIC_BETWEEN, new Object[]{start, end});
|
||||
return QueryCondition.create(this, SqlConsts.BETWEEN, new Object[]{start, end});
|
||||
}
|
||||
|
||||
public <T> QueryCondition between(Object start, Object end, Predicate<T> fn) {
|
||||
return QueryCondition.create(this, QueryCondition.LOGIC_BETWEEN, new Object[]{start, end}).when(fn);
|
||||
return QueryCondition.create(this, SqlConsts.BETWEEN, new Object[]{start, end}).when(fn);
|
||||
}
|
||||
|
||||
|
||||
@ -433,22 +434,22 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
|
||||
* @param end
|
||||
*/
|
||||
public QueryCondition notBetween(Object start, Object end) {
|
||||
return QueryCondition.create(this, QueryCondition.LOGIC_NOT_BETWEEN, new Object[]{start, end});
|
||||
return QueryCondition.create(this, SqlConsts.NOT_BETWEEN, new Object[]{start, end});
|
||||
}
|
||||
|
||||
public <T> QueryCondition notBetween(Object start, Object end, Predicate<T> fn) {
|
||||
return QueryCondition.create(this, QueryCondition.LOGIC_NOT_BETWEEN, new Object[]{start, end}).when(fn);
|
||||
return QueryCondition.create(this, SqlConsts.NOT_BETWEEN, new Object[]{start, end}).when(fn);
|
||||
}
|
||||
|
||||
|
||||
////order by ////
|
||||
public QueryOrderBy asc() {
|
||||
return new QueryOrderBy(this);
|
||||
return new QueryOrderBy(this, SqlConsts.ASC);
|
||||
}
|
||||
|
||||
|
||||
public QueryOrderBy desc() {
|
||||
return new QueryOrderBy(this, "DESC");
|
||||
return new QueryOrderBy(this, SqlConsts.DESC);
|
||||
}
|
||||
|
||||
|
||||
@ -492,11 +493,11 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
|
||||
return dialect.wrap(name);
|
||||
} else {
|
||||
if (StringUtil.isNotBlank(selectTable.alias)) {
|
||||
return dialect.wrap(selectTable.alias) + "." + dialect.wrap(name);
|
||||
return dialect.wrap(selectTable.alias) + SqlConsts.REFERENCE + dialect.wrap(name);
|
||||
} else if (StringUtil.isNotBlank(selectTable.getSchema()) && StringUtil.isNotBlank(selectTable.getName())) {
|
||||
return dialect.wrap(dialect.getRealSchema(selectTable.schema)) + "." + dialect.wrap(dialect.getRealTable(selectTable.getName())) + "." + dialect.wrap(name);
|
||||
return dialect.wrap(dialect.getRealSchema(selectTable.schema)) + SqlConsts.REFERENCE + dialect.wrap(dialect.getRealTable(selectTable.getName())) + SqlConsts.REFERENCE + dialect.wrap(name);
|
||||
} else if (StringUtil.isNotBlank(selectTable.getName())) {
|
||||
return dialect.wrap(dialect.getRealTable(selectTable.getName())) + "." + dialect.wrap(name);
|
||||
return dialect.wrap(dialect.getRealTable(selectTable.getName())) + SqlConsts.REFERENCE + dialect.wrap(name);
|
||||
} else {
|
||||
return dialect.wrap(name);
|
||||
}
|
||||
@ -505,7 +506,7 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
|
||||
|
||||
|
||||
String toSelectSql(List<QueryTable> queryTables, IDialect dialect) {
|
||||
return toConditionSql(queryTables, dialect) + WrapperUtil.buildAsAlias(alias, dialect);
|
||||
return toConditionSql(queryTables, dialect) + WrapperUtil.withAliasIf(alias, dialect);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -16,6 +16,7 @@
|
||||
package com.mybatisflex.core.query;
|
||||
|
||||
|
||||
import com.mybatisflex.core.constant.SqlConsts;
|
||||
import com.mybatisflex.core.dialect.IDialect;
|
||||
import com.mybatisflex.core.exception.FlexExceptions;
|
||||
import com.mybatisflex.core.util.ClassUtil;
|
||||
@ -28,22 +29,6 @@ import java.util.function.Supplier;
|
||||
|
||||
public class QueryCondition implements CloneSupport<QueryCondition> {
|
||||
|
||||
public static final String LOGIC_LIKE = "LIKE";
|
||||
public static final String LOGIC_GT = ">";
|
||||
public static final String LOGIC_GE = ">=";
|
||||
public static final String LOGIC_LT = "<";
|
||||
public static final String LOGIC_LE = "<=";
|
||||
public static final String LOGIC_EQUALS = "=";
|
||||
public static final String LOGIC_NOT_EQUALS = "!=";
|
||||
|
||||
public static final String LOGIC_IS_NULL = "IS NULL";
|
||||
public static final String LOGIC_IS_NOT_NULL = "IS NOT NULL";
|
||||
|
||||
public static final String LOGIC_IN = "IN";
|
||||
public static final String LOGIC_NOT_IN = "NOT IN";
|
||||
public static final String LOGIC_BETWEEN = "BETWEEN";
|
||||
public static final String LOGIC_NOT_BETWEEN = "NOT BETWEEN";
|
||||
|
||||
|
||||
protected QueryColumn column;
|
||||
protected String logic;
|
||||
@ -73,7 +58,7 @@ public class QueryCondition implements CloneSupport<QueryCondition> {
|
||||
}
|
||||
|
||||
public static QueryCondition create(QueryColumn queryColumn, Object value) {
|
||||
return create(queryColumn, LOGIC_EQUALS, value);
|
||||
return create(queryColumn, SqlConsts.EQUALS, value);
|
||||
}
|
||||
|
||||
public static QueryCondition create(QueryColumn queryColumn, String logic, Object value) {
|
||||
@ -124,12 +109,12 @@ public class QueryCondition implements CloneSupport<QueryCondition> {
|
||||
|
||||
public <T> QueryCondition when(Predicate<T> fn) {
|
||||
Object val = this.value;
|
||||
if (LOGIC_LIKE.equals(logic) && val instanceof String) {
|
||||
if (SqlConsts.LIKE.equals(logic) && val instanceof String) {
|
||||
String valStr = (String) val;
|
||||
if (valStr.startsWith("%")) {
|
||||
if (valStr.startsWith(SqlConsts.PERCENT_SIGN)) {
|
||||
valStr = valStr.substring(1);
|
||||
}
|
||||
if (valStr.endsWith("%")) {
|
||||
if (valStr.endsWith(SqlConsts.PERCENT_SIGN)) {
|
||||
valStr = valStr.substring(0, valStr.length() - 1);
|
||||
}
|
||||
val = valStr;
|
||||
@ -188,7 +173,7 @@ public class QueryCondition implements CloneSupport<QueryCondition> {
|
||||
//列
|
||||
sql.append(getColumn().toConditionSql(queryTables, dialect));
|
||||
//逻辑符号
|
||||
sql.append(" ").append(logic).append(" ");
|
||||
sql.append(logic);
|
||||
|
||||
//值(或者问号)
|
||||
if (value instanceof QueryColumn) {
|
||||
@ -196,7 +181,9 @@ public class QueryCondition implements CloneSupport<QueryCondition> {
|
||||
}
|
||||
//子查询
|
||||
else if (value instanceof QueryWrapper) {
|
||||
sql.append("(").append(dialect.buildSelectSql((QueryWrapper) value)).append(")");
|
||||
sql.append(SqlConsts.LEFT_BRACKET)
|
||||
.append(dialect.buildSelectSql((QueryWrapper) value))
|
||||
.append(SqlConsts.RIGHT_BRACKET);
|
||||
}
|
||||
//原生sql
|
||||
else if (value instanceof RawFragment) {
|
||||
@ -225,8 +212,9 @@ public class QueryCondition implements CloneSupport<QueryCondition> {
|
||||
|
||||
|
||||
protected void appendQuestionMark(StringBuilder sqlBuilder) {
|
||||
if (LOGIC_IS_NULL.equals(logic)
|
||||
|| LOGIC_IS_NOT_NULL.equals(logic)
|
||||
//noinspection StatementWithEmptyBody
|
||||
if (SqlConsts.IS_NULL.equals(logic)
|
||||
|| SqlConsts.IS_NOT_NULL.equals(logic)
|
||||
|| value instanceof QueryColumn
|
||||
|| value instanceof QueryWrapper
|
||||
|| value instanceof RawFragment) {
|
||||
@ -234,22 +222,22 @@ public class QueryCondition implements CloneSupport<QueryCondition> {
|
||||
}
|
||||
|
||||
//between, not between
|
||||
else if (LOGIC_BETWEEN.equals(logic) || LOGIC_NOT_BETWEEN.equals(logic)) {
|
||||
sqlBuilder.append(" ? AND ? ");
|
||||
else if (SqlConsts.BETWEEN.equals(logic) || SqlConsts.NOT_BETWEEN.equals(logic)) {
|
||||
sqlBuilder.append(SqlConsts.AND_PLACEHOLDER);
|
||||
}
|
||||
//in, not in
|
||||
else if (LOGIC_IN.equals(logic) || LOGIC_NOT_IN.equals(logic)) {
|
||||
else if (SqlConsts.IN.equals(logic) || SqlConsts.NOT_IN.equals(logic)) {
|
||||
int paramsCount = calculateValueArrayCount();
|
||||
sqlBuilder.append('(');
|
||||
sqlBuilder.append(SqlConsts.LEFT_BRACKET);
|
||||
for (int i = 0; i < paramsCount; i++) {
|
||||
sqlBuilder.append('?');
|
||||
sqlBuilder.append(SqlConsts.PLACEHOLDER);
|
||||
if (i != paramsCount - 1) {
|
||||
sqlBuilder.append(',');
|
||||
sqlBuilder.append(SqlConsts.DELIMITER);
|
||||
}
|
||||
}
|
||||
sqlBuilder.append(')');
|
||||
sqlBuilder.append(SqlConsts.RIGHT_BRACKET);
|
||||
} else {
|
||||
sqlBuilder.append(" ? ");
|
||||
sqlBuilder.append(SqlConsts.PLACEHOLDER);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
/**
|
||||
/*
|
||||
* Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com).
|
||||
* <p>
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@ -15,6 +15,7 @@
|
||||
*/
|
||||
package com.mybatisflex.core.query;
|
||||
|
||||
import com.mybatisflex.core.constant.SqlConsts;
|
||||
import com.mybatisflex.core.util.LambdaGetter;
|
||||
import com.mybatisflex.core.util.LambdaUtil;
|
||||
|
||||
@ -22,118 +23,118 @@ public class QueryMethods {
|
||||
|
||||
/////count
|
||||
public static FunctionQueryColumn count() {
|
||||
return new FunctionQueryColumn("COUNT", new StringQueryColumn("*"));
|
||||
return new FunctionQueryColumn(SqlConsts.COUNT, new StringQueryColumn("*"));
|
||||
}
|
||||
|
||||
public static FunctionQueryColumn count(String column) {
|
||||
return new FunctionQueryColumn("COUNT", column);
|
||||
return new FunctionQueryColumn(SqlConsts.COUNT, column);
|
||||
}
|
||||
|
||||
public static FunctionQueryColumn count(QueryColumn column) {
|
||||
return new FunctionQueryColumn("COUNT", column);
|
||||
return new FunctionQueryColumn(SqlConsts.COUNT, column);
|
||||
}
|
||||
|
||||
public static <T> FunctionQueryColumn count(LambdaGetter<T> fn) {
|
||||
return new FunctionQueryColumn("COUNT", LambdaUtil.getQueryColumn(fn));
|
||||
return new FunctionQueryColumn(SqlConsts.COUNT, LambdaUtil.getQueryColumn(fn));
|
||||
}
|
||||
|
||||
|
||||
/////max
|
||||
public static FunctionQueryColumn max(String column) {
|
||||
return new FunctionQueryColumn("MAX", column);
|
||||
return new FunctionQueryColumn(SqlConsts.MAX, column);
|
||||
}
|
||||
|
||||
public static FunctionQueryColumn max(QueryColumn column) {
|
||||
return new FunctionQueryColumn("MAX", column);
|
||||
return new FunctionQueryColumn(SqlConsts.MAX, column);
|
||||
}
|
||||
|
||||
public static <T> FunctionQueryColumn max(LambdaGetter<T> fn) {
|
||||
return new FunctionQueryColumn("MAX", LambdaUtil.getQueryColumn(fn));
|
||||
return new FunctionQueryColumn(SqlConsts.MAX, LambdaUtil.getQueryColumn(fn));
|
||||
}
|
||||
|
||||
|
||||
/////min
|
||||
public static FunctionQueryColumn min(String column) {
|
||||
return new FunctionQueryColumn("MIN", column);
|
||||
return new FunctionQueryColumn(SqlConsts.MIN, column);
|
||||
}
|
||||
|
||||
public static FunctionQueryColumn min(QueryColumn column) {
|
||||
return new FunctionQueryColumn("MIN", column);
|
||||
return new FunctionQueryColumn(SqlConsts.MIN, column);
|
||||
}
|
||||
|
||||
public static <T> FunctionQueryColumn min(LambdaGetter<T> fn) {
|
||||
return new FunctionQueryColumn("MIN", LambdaUtil.getQueryColumn(fn));
|
||||
return new FunctionQueryColumn(SqlConsts.MIN, LambdaUtil.getQueryColumn(fn));
|
||||
}
|
||||
|
||||
|
||||
/////avg
|
||||
public static FunctionQueryColumn avg(String column) {
|
||||
return new FunctionQueryColumn("AVG", column);
|
||||
return new FunctionQueryColumn(SqlConsts.AVG, column);
|
||||
}
|
||||
|
||||
public static FunctionQueryColumn avg(QueryColumn column) {
|
||||
return new FunctionQueryColumn("AVG", column);
|
||||
return new FunctionQueryColumn(SqlConsts.AVG, column);
|
||||
}
|
||||
|
||||
public static <T> FunctionQueryColumn avg(LambdaGetter<T> fn) {
|
||||
return new FunctionQueryColumn("AVG", LambdaUtil.getQueryColumn(fn));
|
||||
return new FunctionQueryColumn(SqlConsts.AVG, LambdaUtil.getQueryColumn(fn));
|
||||
}
|
||||
|
||||
|
||||
/////sum
|
||||
public static FunctionQueryColumn sum(String column) {
|
||||
return new FunctionQueryColumn("SUM", column);
|
||||
return new FunctionQueryColumn(SqlConsts.SUM, column);
|
||||
}
|
||||
|
||||
public static FunctionQueryColumn sum(QueryColumn column) {
|
||||
return new FunctionQueryColumn("SUM", column);
|
||||
return new FunctionQueryColumn(SqlConsts.SUM, column);
|
||||
}
|
||||
|
||||
public static <T> FunctionQueryColumn sum(LambdaGetter<T> fn) {
|
||||
return new FunctionQueryColumn("SUM", LambdaUtil.getQueryColumn(fn));
|
||||
return new FunctionQueryColumn(SqlConsts.SUM, LambdaUtil.getQueryColumn(fn));
|
||||
}
|
||||
|
||||
|
||||
/////year
|
||||
public static FunctionQueryColumn year(String column) {
|
||||
return new FunctionQueryColumn("YEAR", column);
|
||||
return new FunctionQueryColumn(SqlConsts.YEAR, column);
|
||||
}
|
||||
|
||||
|
||||
public static FunctionQueryColumn year(QueryColumn column) {
|
||||
return new FunctionQueryColumn("YEAR", column);
|
||||
return new FunctionQueryColumn(SqlConsts.YEAR, column);
|
||||
}
|
||||
|
||||
public static <T> FunctionQueryColumn year(LambdaGetter<T> fn) {
|
||||
return new FunctionQueryColumn("YEAR", LambdaUtil.getQueryColumn(fn));
|
||||
return new FunctionQueryColumn(SqlConsts.YEAR, LambdaUtil.getQueryColumn(fn));
|
||||
}
|
||||
|
||||
|
||||
/////month
|
||||
public static FunctionQueryColumn month(String column) {
|
||||
return new FunctionQueryColumn("MONTH", column);
|
||||
return new FunctionQueryColumn(SqlConsts.MONTH, column);
|
||||
}
|
||||
|
||||
public static FunctionQueryColumn month(QueryColumn column) {
|
||||
return new FunctionQueryColumn("MONTH", column);
|
||||
return new FunctionQueryColumn(SqlConsts.MONTH, column);
|
||||
}
|
||||
|
||||
public static <T> FunctionQueryColumn month(LambdaGetter<T> fn) {
|
||||
return new FunctionQueryColumn("MONTH", LambdaUtil.getQueryColumn(fn));
|
||||
return new FunctionQueryColumn(SqlConsts.MONTH, LambdaUtil.getQueryColumn(fn));
|
||||
}
|
||||
|
||||
|
||||
/////month
|
||||
public static FunctionQueryColumn day(String column) {
|
||||
return new FunctionQueryColumn("DAY", column);
|
||||
return new FunctionQueryColumn(SqlConsts.DAY, column);
|
||||
}
|
||||
|
||||
public static FunctionQueryColumn day(QueryColumn column) {
|
||||
return new FunctionQueryColumn("DAY", column);
|
||||
return new FunctionQueryColumn(SqlConsts.DAY, column);
|
||||
}
|
||||
|
||||
public static <T> FunctionQueryColumn day(LambdaGetter<T> fn) {
|
||||
return new FunctionQueryColumn("DAY", LambdaUtil.getQueryColumn(fn));
|
||||
return new FunctionQueryColumn(SqlConsts.DAY, LambdaUtil.getQueryColumn(fn));
|
||||
}
|
||||
|
||||
|
||||
@ -155,7 +156,7 @@ public class QueryMethods {
|
||||
|
||||
//CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
|
||||
public static StringFunctionQueryColumn convert(String... params) {
|
||||
return new StringFunctionQueryColumn("CONVERT", params);
|
||||
return new StringFunctionQueryColumn(SqlConsts.CONVERT, params);
|
||||
}
|
||||
|
||||
public static StringQueryColumn column(String column) {
|
||||
@ -179,15 +180,15 @@ public class QueryMethods {
|
||||
}
|
||||
|
||||
public static QueryCondition exists(QueryWrapper queryWrapper) {
|
||||
return new OperatorSelectCondition(" EXISTS ", queryWrapper);
|
||||
return new OperatorSelectCondition(SqlConsts.EXISTS, queryWrapper);
|
||||
}
|
||||
|
||||
public static QueryCondition notExists(QueryWrapper queryWrapper) {
|
||||
return new OperatorSelectCondition(" NOT EXISTS ", queryWrapper);
|
||||
return new OperatorSelectCondition(SqlConsts.NOT_EXISTS, queryWrapper);
|
||||
}
|
||||
|
||||
public static QueryCondition not(QueryCondition childCondition) {
|
||||
return new OperatorQueryCondition(" NOT ", childCondition);
|
||||
return new OperatorQueryCondition(SqlConsts.NOT, childCondition);
|
||||
}
|
||||
|
||||
public static QueryCondition noCondition() {
|
||||
|
||||
@ -16,6 +16,7 @@
|
||||
package com.mybatisflex.core.query;
|
||||
|
||||
|
||||
import com.mybatisflex.core.constant.SqlConsts;
|
||||
import com.mybatisflex.core.dialect.IDialect;
|
||||
import com.mybatisflex.core.exception.FlexExceptions;
|
||||
import com.mybatisflex.core.util.ObjectUtil;
|
||||
@ -29,7 +30,7 @@ public class QueryOrderBy implements CloneSupport<QueryOrderBy> {
|
||||
|
||||
private QueryColumn queryColumn;
|
||||
|
||||
private String orderType = "ASC"; //asc desc
|
||||
private String orderType = SqlConsts.ASC; //asc desc
|
||||
|
||||
private boolean nullsFirst = false;
|
||||
private boolean nullsLast = false;
|
||||
@ -63,11 +64,11 @@ public class QueryOrderBy implements CloneSupport<QueryOrderBy> {
|
||||
|
||||
|
||||
public String toSql(List<QueryTable> queryTables, IDialect dialect) {
|
||||
String sql = queryColumn.toConditionSql(queryTables, dialect) + " " + orderType;
|
||||
String sql = queryColumn.toConditionSql(queryTables, dialect) + orderType;
|
||||
if (nullsFirst) {
|
||||
sql = sql + " NULLS FIRST";
|
||||
sql = sql + SqlConsts.NULLS_FIRST;
|
||||
} else if (nullsLast) {
|
||||
sql = sql + " NULLS LAST";
|
||||
sql = sql + SqlConsts.NULLS_LAST;
|
||||
}
|
||||
return sql;
|
||||
}
|
||||
|
||||
@ -98,9 +98,9 @@ public class QueryTable implements CloneSupport<QueryTable> {
|
||||
public String toSql(IDialect dialect) {
|
||||
String sql;
|
||||
if (StringUtil.isNotBlank(schema)) {
|
||||
sql = dialect.wrap(dialect.getRealSchema(schema)) + "." + dialect.wrap(dialect.getRealTable(name)) + WrapperUtil.buildAsAlias(alias, dialect);
|
||||
sql = dialect.wrap(dialect.getRealSchema(schema)) + "." + dialect.wrap(dialect.getRealTable(name)) + WrapperUtil.withAliasIf(alias, dialect);
|
||||
} else {
|
||||
sql = dialect.wrap(dialect.getRealTable(name)) + WrapperUtil.buildAsAlias(alias, dialect);
|
||||
sql = dialect.wrap(dialect.getRealTable(name)) + WrapperUtil.withAliasIf(alias, dialect);
|
||||
}
|
||||
return sql;
|
||||
}
|
||||
|
||||
@ -16,6 +16,7 @@
|
||||
package com.mybatisflex.core.query;
|
||||
|
||||
import com.mybatisflex.core.FlexConsts;
|
||||
import com.mybatisflex.core.constant.SqlConsts;
|
||||
import com.mybatisflex.core.dialect.DialectFactory;
|
||||
import com.mybatisflex.core.table.TableDef;
|
||||
import com.mybatisflex.core.table.TableInfo;
|
||||
@ -222,86 +223,86 @@ public class QueryWrapper extends BaseQueryWrapper<QueryWrapper> {
|
||||
}
|
||||
|
||||
public Joiner<QueryWrapper> leftJoin(String table) {
|
||||
return joining(Join.TYPE_LEFT, new QueryTable(table), true);
|
||||
return joining(SqlConsts.LEFT_JOIN, new QueryTable(table), true);
|
||||
}
|
||||
|
||||
|
||||
public Joiner<QueryWrapper> leftJoin(String table, boolean when) {
|
||||
return joining(Join.TYPE_LEFT, new QueryTable(table), when);
|
||||
return joining(SqlConsts.LEFT_JOIN, new QueryTable(table), when);
|
||||
}
|
||||
|
||||
public Joiner<QueryWrapper> leftJoin(Class<?> entityClass) {
|
||||
return joining(Join.TYPE_LEFT, entityClass, true);
|
||||
return joining(SqlConsts.LEFT_JOIN, entityClass, true);
|
||||
}
|
||||
|
||||
public Joiner<QueryWrapper> leftJoin(Class<?> entityClass, boolean when) {
|
||||
return joining(Join.TYPE_LEFT, entityClass, when);
|
||||
return joining(SqlConsts.LEFT_JOIN, entityClass, when);
|
||||
}
|
||||
|
||||
public Joiner<QueryWrapper> leftJoin(TableDef table) {
|
||||
return joining(Join.TYPE_LEFT, new QueryTable(table), true);
|
||||
return joining(SqlConsts.LEFT_JOIN, new QueryTable(table), true);
|
||||
}
|
||||
|
||||
public Joiner<QueryWrapper> leftJoin(TableDef table, boolean when) {
|
||||
return joining(Join.TYPE_LEFT, new QueryTable(table), when);
|
||||
return joining(SqlConsts.LEFT_JOIN, new QueryTable(table), when);
|
||||
}
|
||||
|
||||
public Joiner<QueryWrapper> leftJoin(QueryWrapper table) {
|
||||
return joining(Join.TYPE_LEFT, table, true);
|
||||
return joining(SqlConsts.LEFT_JOIN, table, true);
|
||||
}
|
||||
|
||||
public Joiner<QueryWrapper> leftJoin(QueryWrapper table, boolean when) {
|
||||
return joining(Join.TYPE_LEFT, table, when);
|
||||
return joining(SqlConsts.LEFT_JOIN, table, when);
|
||||
}
|
||||
|
||||
|
||||
public Joiner<QueryWrapper> rightJoin(String table) {
|
||||
return joining(Join.TYPE_RIGHT, new QueryTable(table), true);
|
||||
return joining(SqlConsts.RIGHT_JOIN, new QueryTable(table), true);
|
||||
}
|
||||
|
||||
public Joiner<QueryWrapper> rightJoin(String table, boolean when) {
|
||||
return joining(Join.TYPE_RIGHT, new QueryTable(table), when);
|
||||
return joining(SqlConsts.RIGHT_JOIN, new QueryTable(table), when);
|
||||
}
|
||||
|
||||
public Joiner<QueryWrapper> rightJoin(Class<?> entityClass) {
|
||||
return joining(Join.TYPE_RIGHT, entityClass, true);
|
||||
return joining(SqlConsts.RIGHT_JOIN, entityClass, true);
|
||||
}
|
||||
|
||||
public Joiner<QueryWrapper> rightJoin(Class<?> entityClass, boolean when) {
|
||||
return joining(Join.TYPE_RIGHT, entityClass, when);
|
||||
return joining(SqlConsts.RIGHT_JOIN, entityClass, when);
|
||||
}
|
||||
|
||||
public Joiner<QueryWrapper> rightJoin(TableDef table) {
|
||||
return joining(Join.TYPE_RIGHT, new QueryTable(table), true);
|
||||
return joining(SqlConsts.RIGHT_JOIN, new QueryTable(table), true);
|
||||
}
|
||||
|
||||
public Joiner<QueryWrapper> rightJoin(TableDef table, boolean when) {
|
||||
return joining(Join.TYPE_RIGHT, new QueryTable(table), when);
|
||||
return joining(SqlConsts.RIGHT_JOIN, new QueryTable(table), when);
|
||||
}
|
||||
|
||||
public Joiner<QueryWrapper> rightJoin(QueryWrapper table) {
|
||||
return joining(Join.TYPE_RIGHT, table, true);
|
||||
return joining(SqlConsts.RIGHT_JOIN, table, true);
|
||||
}
|
||||
|
||||
public Joiner<QueryWrapper> rightJoin(QueryWrapper table, boolean when) {
|
||||
return joining(Join.TYPE_RIGHT, table, when);
|
||||
return joining(SqlConsts.RIGHT_JOIN, table, when);
|
||||
}
|
||||
|
||||
|
||||
public Joiner<QueryWrapper> innerJoin(String table) {
|
||||
return joining(Join.TYPE_INNER, new QueryTable(table), true);
|
||||
return joining(SqlConsts.INNER_JOIN, new QueryTable(table), true);
|
||||
}
|
||||
|
||||
public Joiner<QueryWrapper> innerJoin(String table, boolean when) {
|
||||
return joining(Join.TYPE_INNER, new QueryTable(table), when);
|
||||
return joining(SqlConsts.INNER_JOIN, new QueryTable(table), when);
|
||||
}
|
||||
|
||||
public Joiner<QueryWrapper> innerJoin(Class<?> entityClass) {
|
||||
return joining(Join.TYPE_INNER, entityClass, true);
|
||||
return joining(SqlConsts.INNER_JOIN, entityClass, true);
|
||||
}
|
||||
|
||||
public Joiner<QueryWrapper> innerJoin(Class<?> entityClass, boolean when) {
|
||||
return joining(Join.TYPE_INNER, entityClass, when);
|
||||
return joining(SqlConsts.INNER_JOIN, entityClass, when);
|
||||
}
|
||||
|
||||
public Joiner<QueryWrapper> innerJoin(TableDef table) {
|
||||
@ -309,114 +310,114 @@ public class QueryWrapper extends BaseQueryWrapper<QueryWrapper> {
|
||||
}
|
||||
|
||||
public Joiner<QueryWrapper> innerJoin(TableDef table, boolean when) {
|
||||
return joining(Join.TYPE_INNER, new QueryTable(table), when);
|
||||
return joining(SqlConsts.INNER_JOIN, new QueryTable(table), when);
|
||||
}
|
||||
|
||||
public Joiner<QueryWrapper> innerJoin(QueryWrapper table) {
|
||||
return joining(Join.TYPE_INNER, table, true);
|
||||
return joining(SqlConsts.INNER_JOIN, table, true);
|
||||
}
|
||||
|
||||
public Joiner<QueryWrapper> innerJoin(QueryWrapper table, boolean when) {
|
||||
return joining(Join.TYPE_INNER, table, when);
|
||||
return joining(SqlConsts.INNER_JOIN, table, when);
|
||||
}
|
||||
|
||||
|
||||
public Joiner<QueryWrapper> fullJoin(String table) {
|
||||
return joining(Join.TYPE_FULL, new QueryTable(table), true);
|
||||
return joining(SqlConsts.FULL_JOIN, new QueryTable(table), true);
|
||||
}
|
||||
|
||||
public Joiner<QueryWrapper> fullJoin(String table, boolean when) {
|
||||
return joining(Join.TYPE_FULL, new QueryTable(table), when);
|
||||
return joining(SqlConsts.FULL_JOIN, new QueryTable(table), when);
|
||||
}
|
||||
|
||||
public Joiner<QueryWrapper> fullJoin(Class<?> entityClass) {
|
||||
return joining(Join.TYPE_FULL, entityClass, true);
|
||||
return joining(SqlConsts.FULL_JOIN, entityClass, true);
|
||||
}
|
||||
|
||||
public Joiner<QueryWrapper> fullJoin(Class<?> entityClass, boolean when) {
|
||||
return joining(Join.TYPE_FULL, entityClass, when);
|
||||
return joining(SqlConsts.FULL_JOIN, entityClass, when);
|
||||
}
|
||||
|
||||
public Joiner<QueryWrapper> fullJoin(TableDef table) {
|
||||
return joining(Join.TYPE_FULL, new QueryTable(table), true);
|
||||
return joining(SqlConsts.FULL_JOIN, new QueryTable(table), true);
|
||||
}
|
||||
|
||||
public Joiner<QueryWrapper> fullJoin(TableDef table, boolean when) {
|
||||
return joining(Join.TYPE_FULL, new QueryTable(table), when);
|
||||
return joining(SqlConsts.FULL_JOIN, new QueryTable(table), when);
|
||||
}
|
||||
|
||||
public Joiner<QueryWrapper> fullJoin(QueryWrapper table) {
|
||||
return joining(Join.TYPE_FULL, table, true);
|
||||
return joining(SqlConsts.FULL_JOIN, table, true);
|
||||
}
|
||||
|
||||
public Joiner<QueryWrapper> fullJoin(QueryWrapper table, boolean when) {
|
||||
return joining(Join.TYPE_FULL, table, when);
|
||||
return joining(SqlConsts.FULL_JOIN, table, when);
|
||||
}
|
||||
|
||||
|
||||
public Joiner<QueryWrapper> crossJoin(String table) {
|
||||
return joining(Join.TYPE_CROSS, new QueryTable(table), true);
|
||||
return joining(SqlConsts.CROSS_JOIN, new QueryTable(table), true);
|
||||
}
|
||||
|
||||
public Joiner<QueryWrapper> crossJoin(String table, boolean when) {
|
||||
return joining(Join.TYPE_CROSS, new QueryTable(table), when);
|
||||
return joining(SqlConsts.CROSS_JOIN, new QueryTable(table), when);
|
||||
}
|
||||
|
||||
public Joiner<QueryWrapper> crossJoin(Class<?> entityClass) {
|
||||
return joining(Join.TYPE_CROSS, entityClass, true);
|
||||
return joining(SqlConsts.CROSS_JOIN, entityClass, true);
|
||||
}
|
||||
|
||||
public Joiner<QueryWrapper> crossJoin(Class<?> entityClass, boolean when) {
|
||||
return joining(Join.TYPE_CROSS, entityClass, when);
|
||||
return joining(SqlConsts.CROSS_JOIN, entityClass, when);
|
||||
}
|
||||
|
||||
public Joiner<QueryWrapper> crossJoin(TableDef table) {
|
||||
return joining(Join.TYPE_CROSS, new QueryTable(table), true);
|
||||
return joining(SqlConsts.CROSS_JOIN, new QueryTable(table), true);
|
||||
}
|
||||
|
||||
public Joiner<QueryWrapper> crossJoin(TableDef table, boolean when) {
|
||||
return joining(Join.TYPE_CROSS, new QueryTable(table), when);
|
||||
return joining(SqlConsts.CROSS_JOIN, new QueryTable(table), when);
|
||||
}
|
||||
|
||||
public Joiner<QueryWrapper> crossJoin(QueryWrapper table) {
|
||||
return joining(Join.TYPE_CROSS, table, true);
|
||||
return joining(SqlConsts.CROSS_JOIN, table, true);
|
||||
}
|
||||
|
||||
public Joiner<QueryWrapper> crossJoin(QueryWrapper table, boolean when) {
|
||||
return joining(Join.TYPE_CROSS, table, when);
|
||||
return joining(SqlConsts.CROSS_JOIN, table, when);
|
||||
}
|
||||
|
||||
|
||||
public Joiner<QueryWrapper> join(String table) {
|
||||
return joining(Join.TYPE_JOIN, new QueryTable(table), true);
|
||||
return joining(SqlConsts.JOIN, new QueryTable(table), true);
|
||||
}
|
||||
|
||||
public Joiner<QueryWrapper> join(String table, boolean when) {
|
||||
return joining(Join.TYPE_JOIN, new QueryTable(table), when);
|
||||
return joining(SqlConsts.JOIN, new QueryTable(table), when);
|
||||
}
|
||||
|
||||
public Joiner<QueryWrapper> join(Class<?> entityClass) {
|
||||
return joining(Join.TYPE_JOIN, entityClass, true);
|
||||
return joining(SqlConsts.JOIN, entityClass, true);
|
||||
}
|
||||
|
||||
public Joiner<QueryWrapper> join(Class<?> entityClass, boolean when) {
|
||||
return joining(Join.TYPE_JOIN, entityClass, when);
|
||||
return joining(SqlConsts.JOIN, entityClass, when);
|
||||
}
|
||||
|
||||
public Joiner<QueryWrapper> join(TableDef table) {
|
||||
return joining(Join.TYPE_JOIN, new QueryTable(table), true);
|
||||
return joining(SqlConsts.JOIN, new QueryTable(table), true);
|
||||
}
|
||||
|
||||
public Joiner<QueryWrapper> join(TableDef table, boolean when) {
|
||||
return joining(Join.TYPE_JOIN, new QueryTable(table), when);
|
||||
return joining(SqlConsts.JOIN, new QueryTable(table), when);
|
||||
}
|
||||
|
||||
public Joiner<QueryWrapper> join(QueryWrapper table) {
|
||||
return joining(Join.TYPE_JOIN, table, true);
|
||||
return joining(SqlConsts.JOIN, table, true);
|
||||
}
|
||||
|
||||
public Joiner<QueryWrapper> join(QueryWrapper table, boolean when) {
|
||||
return joining(Join.TYPE_JOIN, table, when);
|
||||
return joining(SqlConsts.JOIN, table, when);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -15,6 +15,7 @@
|
||||
*/
|
||||
package com.mybatisflex.core.query;
|
||||
|
||||
import com.mybatisflex.core.constant.SqlConsts;
|
||||
import com.mybatisflex.core.dialect.IDialect;
|
||||
|
||||
import java.util.List;
|
||||
@ -48,7 +49,7 @@ public class RawFragment extends QueryCondition {
|
||||
if (prevEffectiveCondition != null) {
|
||||
sql.append(prevEffectiveCondition.connector);
|
||||
}
|
||||
sql.append(" ").append(content).append(" ");
|
||||
sql.append(SqlConsts.BLANK).append(content).append(SqlConsts.BLANK);
|
||||
}
|
||||
|
||||
if (this.next != null) {
|
||||
|
||||
@ -45,7 +45,7 @@ public class SelectQueryColumn extends QueryColumn implements HasParamsColumn {
|
||||
String toSelectSql(List<QueryTable> queryTables, IDialect dialect) {
|
||||
String selectSql = dialect.forSelectByQuery(queryWrapper);
|
||||
if (StringUtil.isNotBlank(selectSql) && StringUtil.isNotBlank(alias)) {
|
||||
selectSql = "(" + selectSql + ") AS " + dialect.wrap(alias);
|
||||
selectSql = WrapperUtil.withAlias(selectSql, dialect.wrap(alias));
|
||||
}
|
||||
return selectSql;
|
||||
}
|
||||
|
||||
@ -49,9 +49,9 @@ public class SelectQueryTable extends QueryTable {
|
||||
public String toSql(IDialect dialect) {
|
||||
String sql = dialect.buildSelectSql(queryWrapper);
|
||||
if (StringUtil.isNotBlank(alias)) {
|
||||
return "(" + sql + ") AS " + dialect.wrap(alias);
|
||||
return WrapperUtil.withAlias(sql, dialect.wrap(alias));
|
||||
} else {
|
||||
return "(" + sql + ")";
|
||||
return WrapperUtil.withBracket(sql);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -15,6 +15,7 @@
|
||||
*/
|
||||
package com.mybatisflex.core.query;
|
||||
|
||||
import com.mybatisflex.core.constant.SqlConsts;
|
||||
import com.mybatisflex.core.dialect.IDialect;
|
||||
import com.mybatisflex.core.util.CollectionUtil;
|
||||
import com.mybatisflex.core.util.SqlUtil;
|
||||
@ -57,14 +58,23 @@ public class StringFunctionQueryColumn extends QueryColumn {
|
||||
|
||||
@Override
|
||||
public String toSelectSql(List<QueryTable> queryTables, IDialect dialect) {
|
||||
String sql = StringUtil.join(", ", params);
|
||||
return StringUtil.isBlank(sql) ? "" : fnName + "(" + sql + ")" + WrapperUtil.buildAsAlias(alias, dialect);
|
||||
String sql = StringUtil.join(SqlConsts.DELIMITER, params);
|
||||
if (StringUtil.isBlank(sql)) {
|
||||
return SqlConsts.EMPTY;
|
||||
}
|
||||
if (StringUtil.isBlank(alias)) {
|
||||
return fnName + WrapperUtil.withBracket(sql);
|
||||
}
|
||||
return fnName + WrapperUtil.withAlias(sql, dialect.wrap(alias));
|
||||
}
|
||||
|
||||
@Override
|
||||
String toConditionSql(List<QueryTable> queryTables, IDialect dialect) {
|
||||
String sql = StringUtil.join(", ", params);
|
||||
return StringUtil.isBlank(sql) ? "" : fnName + "(" + sql + ")";
|
||||
String sql = StringUtil.join(SqlConsts.DELIMITER, params);
|
||||
if (StringUtil.isBlank(sql)) {
|
||||
return SqlConsts.EMPTY;
|
||||
}
|
||||
return fnName + WrapperUtil.withBracket(sql);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -15,6 +15,7 @@
|
||||
*/
|
||||
package com.mybatisflex.core.query;
|
||||
|
||||
import com.mybatisflex.core.constant.SqlConsts;
|
||||
import com.mybatisflex.core.dialect.IDialect;
|
||||
import com.mybatisflex.core.exception.FlexExceptions;
|
||||
import com.mybatisflex.core.util.ObjectUtil;
|
||||
@ -26,14 +27,14 @@ public class UnionWrapper implements CloneSupport<UnionWrapper> {
|
||||
|
||||
public static UnionWrapper union(QueryWrapper queryWrapper) {
|
||||
UnionWrapper unionWrapper = new UnionWrapper();
|
||||
unionWrapper.key = " UNION ";
|
||||
unionWrapper.key = SqlConsts.UNION;
|
||||
unionWrapper.queryWrapper = queryWrapper;
|
||||
return unionWrapper;
|
||||
}
|
||||
|
||||
public static UnionWrapper unionAll(QueryWrapper queryWrapper) {
|
||||
UnionWrapper unionWrapper = new UnionWrapper();
|
||||
unionWrapper.key = " UNION ALL ";
|
||||
unionWrapper.key = SqlConsts.UNION_ALL;
|
||||
unionWrapper.queryWrapper = queryWrapper;
|
||||
return unionWrapper;
|
||||
}
|
||||
@ -59,7 +60,10 @@ public class UnionWrapper implements CloneSupport<UnionWrapper> {
|
||||
}
|
||||
|
||||
public void buildSql(StringBuilder sqlBuilder, IDialect dialect) {
|
||||
sqlBuilder.append(key).append("(").append(dialect.buildSelectSql(queryWrapper)).append(")");
|
||||
sqlBuilder.append(key)
|
||||
.append(SqlConsts.LEFT_BRACKET)
|
||||
.append(dialect.buildSelectSql(queryWrapper))
|
||||
.append(SqlConsts.RIGHT_BRACKET);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -17,6 +17,7 @@ package com.mybatisflex.core.query;
|
||||
|
||||
|
||||
import com.mybatisflex.core.FlexConsts;
|
||||
import com.mybatisflex.core.constant.SqlConsts;
|
||||
import com.mybatisflex.core.dialect.IDialect;
|
||||
import com.mybatisflex.core.util.ClassUtil;
|
||||
import com.mybatisflex.core.util.EnumWrapper;
|
||||
@ -32,10 +33,6 @@ class WrapperUtil {
|
||||
|
||||
private WrapperUtil() {}
|
||||
|
||||
static String buildAsAlias(String alias, IDialect dialect) {
|
||||
return StringUtil.isBlank(alias) ? "" : " AS " + dialect.wrap(alias);
|
||||
}
|
||||
|
||||
static List<QueryWrapper> getChildQueryWrapper(QueryCondition condition) {
|
||||
List<QueryWrapper> list = null;
|
||||
while (condition != null) {
|
||||
@ -131,7 +128,15 @@ class WrapperUtil {
|
||||
}
|
||||
|
||||
|
||||
static String withBracket(String sql) {
|
||||
return SqlConsts.LEFT_BRACKET + sql + SqlConsts.RIGHT_BRACKET;
|
||||
}
|
||||
|
||||
static String withAlias(String sql, String alias) {
|
||||
return SqlConsts.LEFT_BRACKET + sql + SqlConsts.RIGHT_BRACKET + SqlConsts.AS + alias;
|
||||
}
|
||||
|
||||
|
||||
static String withAliasIf(String alias, IDialect dialect) {
|
||||
return StringUtil.isBlank(alias) ? SqlConsts.EMPTY : SqlConsts.AS + dialect.wrap(alias);
|
||||
}
|
||||
}
|
||||
|
||||
@ -21,6 +21,7 @@ import com.mybatisflex.annotation.SetListener;
|
||||
import com.mybatisflex.annotation.UpdateListener;
|
||||
import com.mybatisflex.core.FlexConsts;
|
||||
import com.mybatisflex.core.FlexGlobalConfig;
|
||||
import com.mybatisflex.core.constant.SqlConsts;
|
||||
import com.mybatisflex.core.dialect.IDialect;
|
||||
import com.mybatisflex.core.exception.FlexExceptions;
|
||||
import com.mybatisflex.core.javassist.ModifyAttrsRecord;
|
||||
@ -610,12 +611,12 @@ public class TableInfo {
|
||||
if (versionValue == null) {
|
||||
throw FlexExceptions.wrap("The version value of entity[%s] must not be null.", entity);
|
||||
}
|
||||
queryWrapper.and(QueryCondition.create(schema, tableName, versionColumn, QueryCondition.LOGIC_EQUALS, versionValue));
|
||||
queryWrapper.and(QueryCondition.create(schema, tableName, versionColumn, SqlConsts.EQUALS, versionValue));
|
||||
}
|
||||
|
||||
//逻辑删除
|
||||
if (StringUtil.isNotBlank(logicDeleteColumn)) {
|
||||
queryWrapper.and(QueryCondition.create(schema, tableName, logicDeleteColumn, QueryCondition.LOGIC_EQUALS
|
||||
queryWrapper.and(QueryCondition.create(schema, tableName, logicDeleteColumn, SqlConsts.EQUALS
|
||||
, FlexGlobalConfig.getDefaultConfig().getNormalValueOfLogicDelete()));
|
||||
}
|
||||
|
||||
@ -623,9 +624,9 @@ public class TableInfo {
|
||||
Object[] tenantIdArgs = buildTenantIdArgs();
|
||||
if (ArrayUtil.isNotEmpty(tenantIdArgs)) {
|
||||
if (tenantIdArgs.length == 1) {
|
||||
queryWrapper.and(QueryCondition.create(schema, tableName, tenantIdColumn, QueryCondition.LOGIC_EQUALS, tenantIdArgs[0]));
|
||||
queryWrapper.and(QueryCondition.create(schema, tableName, tenantIdColumn, SqlConsts.EQUALS, tenantIdArgs[0]));
|
||||
} else {
|
||||
queryWrapper.and(QueryCondition.create(schema, tableName, tenantIdColumn, QueryCondition.LOGIC_IN, tenantIdArgs));
|
||||
queryWrapper.and(QueryCondition.create(schema, tableName, tenantIdColumn, SqlConsts.IN, tenantIdArgs));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -16,6 +16,7 @@
|
||||
package com.mybatisflex.core.util;
|
||||
|
||||
import com.mybatisflex.core.BaseMapper;
|
||||
import com.mybatisflex.core.constant.SqlConsts;
|
||||
import com.mybatisflex.core.field.FieldQuery;
|
||||
import com.mybatisflex.core.field.FieldQueryBuilder;
|
||||
import com.mybatisflex.core.query.*;
|
||||
@ -100,7 +101,7 @@ public class MapperUtil {
|
||||
// 只有全是 left join 语句才会清除 join
|
||||
// 因为如果是 inner join 或 right join 往往都会放大记录数
|
||||
for (Join join : joins) {
|
||||
if (!Join.TYPE_LEFT.equals(CPI.getJoinType(join))) {
|
||||
if (!SqlConsts.LEFT_JOIN.equals(CPI.getJoinType(join))) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user