mirror of
https://gitee.com/best_handsome/mybatis-plus-join
synced 2025-07-11 00:02:22 +08:00
条件别名优化
This commit is contained in:
parent
e4914429fe
commit
30ba7ac06c
@ -1,16 +1,22 @@
|
||||
package com.github.yulichang.method;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.FieldStrategy;
|
||||
import com.baomidou.mybatisplus.core.MybatisPlusVersion;
|
||||
import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
|
||||
import com.baomidou.mybatisplus.core.metadata.TableInfo;
|
||||
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Constants;
|
||||
import com.baomidou.mybatisplus.core.toolkit.StringPool;
|
||||
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
|
||||
import com.baomidou.mybatisplus.core.toolkit.sql.SqlScriptUtils;
|
||||
import com.github.yulichang.annotation.DynamicTableName;
|
||||
import com.github.yulichang.config.ConfigProperties;
|
||||
import com.github.yulichang.toolkit.VersionUtils;
|
||||
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.net.URLEncoder;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
import static java.util.stream.Collectors.joining;
|
||||
@ -60,6 +66,33 @@ public interface MPJBaseMethod extends Constants {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* order By
|
||||
*/
|
||||
default String mpjSqlOrderBy(TableInfo tableInfo) {
|
||||
/* 不存在排序字段,直接返回空 */
|
||||
List<TableFieldInfo> orderByFields;
|
||||
try {
|
||||
if (VersionUtils.compare(MybatisPlusVersion.getVersion(), "3.4.3") >= 0) {
|
||||
orderByFields = tableInfo.getOrderByFields();
|
||||
} else {
|
||||
return StringPool.EMPTY;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
return StringPool.EMPTY;
|
||||
}
|
||||
if (CollectionUtils.isEmpty(orderByFields)) {
|
||||
return StringPool.EMPTY;
|
||||
}
|
||||
orderByFields.sort(Comparator.comparingInt(TableFieldInfo::getOrderBySort));
|
||||
String sql = NEWLINE + " ORDER BY " +
|
||||
orderByFields.stream().map(tfi -> String.format("${ew.alias}.%s %s", tfi.getColumn(),
|
||||
tfi.getOrderByType())).collect(joining(","));
|
||||
/* 当wrapper中传递了orderBy属性,@orderBy注解失效 */
|
||||
return SqlScriptUtils.convertIf(sql, String.format("%s == null or %s", WRAPPER,
|
||||
WRAPPER_EXPRESSION_ORDER), true);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 拷贝 tableInfo 里面的 getAllSqlWhere方法
|
||||
|
@ -22,10 +22,11 @@ public class SelectJoinList extends MPJAbstractMethod {
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("DuplicatedCode")
|
||||
public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
|
||||
SqlMethod sqlMethod = SqlMethod.SELECT_JOIN_LIST;
|
||||
String sql = String.format(sqlMethod.getSql(), sqlFirst(), sqlDistinct(), sqlSelectColumns(tableInfo, true),
|
||||
mpjTableName(tableInfo), sqlAlias(), sqlFrom(), sqlWhereEntityWrapper(true, tableInfo), sqlComment());
|
||||
mpjTableName(tableInfo), sqlAlias(), sqlFrom(), sqlWhereEntityWrapper(true, tableInfo), mpjSqlOrderBy(tableInfo), sqlComment());
|
||||
SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
|
||||
return this.addSelectMappedStatementForOther(mapperClass, sqlMethod.getMethod(), sqlSource, MPJResultType.class);
|
||||
}
|
||||
|
@ -24,10 +24,11 @@ public class SelectJoinMaps extends MPJAbstractMethod {
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("DuplicatedCode")
|
||||
public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
|
||||
SqlMethod sqlMethod = SqlMethod.SELECT_JOIN_MAPS;
|
||||
String sql = String.format(sqlMethod.getSql(), sqlFirst(), sqlDistinct(), sqlSelectColumns(tableInfo, true),
|
||||
mpjTableName(tableInfo), sqlAlias(), sqlFrom(), sqlWhereEntityWrapper(true, tableInfo), sqlComment());
|
||||
mpjTableName(tableInfo), sqlAlias(), sqlFrom(), sqlWhereEntityWrapper(true, tableInfo), mpjSqlOrderBy(tableInfo), sqlComment());
|
||||
SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
|
||||
return this.addSelectMappedStatementForOther(mapperClass, sqlMethod.getMethod(), sqlSource, Map.class);
|
||||
}
|
||||
|
@ -24,10 +24,11 @@ public class SelectJoinMapsPage extends MPJAbstractMethod {
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("DuplicatedCode")
|
||||
public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
|
||||
SqlMethod sqlMethod = SqlMethod.SELECT_JOIN_MAPS_PAGE;
|
||||
String sql = String.format(sqlMethod.getSql(), sqlFirst(), sqlDistinct(), sqlSelectColumns(tableInfo, true),
|
||||
mpjTableName(tableInfo), sqlAlias(), sqlFrom(), sqlWhereEntityWrapper(true, tableInfo), sqlComment());
|
||||
mpjTableName(tableInfo), sqlAlias(), sqlFrom(), sqlWhereEntityWrapper(true, tableInfo), mpjSqlOrderBy(tableInfo), sqlComment());
|
||||
SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
|
||||
return this.addSelectMappedStatementForOther(mapperClass, sqlMethod.getMethod(), sqlSource, Map.class);
|
||||
}
|
||||
|
@ -22,10 +22,11 @@ public class SelectJoinPage extends MPJAbstractMethod {
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("DuplicatedCode")
|
||||
public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
|
||||
SqlMethod sqlMethod = SqlMethod.SELECT_JOIN_PAGE;
|
||||
String sql = String.format(sqlMethod.getSql(), sqlFirst(), sqlDistinct(), sqlSelectColumns(tableInfo, true),
|
||||
mpjTableName(tableInfo), sqlAlias(), sqlFrom(), sqlWhereEntityWrapper(true, tableInfo), sqlComment());
|
||||
mpjTableName(tableInfo), sqlAlias(), sqlFrom(), sqlWhereEntityWrapper(true, tableInfo), mpjSqlOrderBy(tableInfo), sqlComment());
|
||||
SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
|
||||
return this.addSelectMappedStatementForOther(mapperClass, sqlMethod.getMethod(), sqlSource, MPJResultType.class);
|
||||
}
|
||||
|
@ -20,19 +20,19 @@ public enum SqlMethod {
|
||||
"<script>\n%s SELECT %s %s FROM %s %s %s %s %s\n</script>"),
|
||||
|
||||
SELECT_JOIN_LIST("selectJoinList", "返回List集合",
|
||||
"<script>\n%s SELECT %s %s FROM %s %s %s %s %s\n</script>"),
|
||||
"<script>\n%s SELECT %s %s FROM %s %s %s %s %s %s\n</script>"),
|
||||
|
||||
SELECT_JOIN_MAP("selectJoinMap", "返回一个Map",
|
||||
"<script>\n%s SELECT %s %s FROM %s %s %s %s %s\n</script>"),
|
||||
|
||||
SELECT_JOIN_MAPS("selectJoinMaps", "返回Map集合",
|
||||
"<script>\n%s SELECT %s %s FROM %s %s %s %s %s\n</script>"),
|
||||
"<script>\n%s SELECT %s %s FROM %s %s %s %s %s %s\n</script>"),
|
||||
|
||||
SELECT_JOIN_PAGE("selectJoinPage", "连表查询并分页",
|
||||
"<script>\n%s SELECT %s %s FROM %s %s %s %s %s\n</script>"),
|
||||
"<script>\n%s SELECT %s %s FROM %s %s %s %s %s %s\n</script>"),
|
||||
|
||||
SELECT_JOIN_MAPS_PAGE("selectJoinMapsPage", "返回Map集合并分页",
|
||||
"<script>\n%s SELECT %s %s FROM %s %s %s %s %s\n</script>");
|
||||
"<script>\n%s SELECT %s %s FROM %s %s %s %s %s %s\n</script>");
|
||||
|
||||
private final String method;
|
||||
private final String sql;
|
||||
|
@ -34,6 +34,12 @@ public class SelectList extends com.baomidou.mybatisplus.core.injector.methods.S
|
||||
super.sqlWhereEntityWrapper(newLine, table), mpjSqlWhereEntityWrapper(newLine, table));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String sqlOrderBy(TableInfo table) {
|
||||
return SqlScriptUtils.convertChoose(String.format("%s == null or !(%s instanceof %s)", Constants.WRAPPER, Constants.WRAPPER, MPJBaseJoin.class.getName()),
|
||||
super.sqlOrderBy(table), mpjSqlOrderBy(table));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String sqlSelectColumns(TableInfo table, boolean queryWrapper) {
|
||||
String selectColumns = super.sqlSelectColumns(table, queryWrapper);
|
||||
|
@ -34,6 +34,12 @@ public class SelectMaps extends com.baomidou.mybatisplus.core.injector.methods.S
|
||||
super.sqlWhereEntityWrapper(newLine, table), mpjSqlWhereEntityWrapper(newLine, table));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String sqlOrderBy(TableInfo table) {
|
||||
return SqlScriptUtils.convertChoose(String.format("%s == null or !(%s instanceof %s)", Constants.WRAPPER, Constants.WRAPPER, MPJBaseJoin.class.getName()),
|
||||
super.sqlOrderBy(table), mpjSqlOrderBy(table));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String sqlSelectColumns(TableInfo table, boolean queryWrapper) {
|
||||
String selectColumns = super.sqlSelectColumns(table, queryWrapper);
|
||||
|
@ -34,6 +34,12 @@ public class SelectMapsPage extends com.baomidou.mybatisplus.core.injector.metho
|
||||
super.sqlWhereEntityWrapper(newLine, table), mpjSqlWhereEntityWrapper(newLine, table));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String sqlOrderBy(TableInfo table) {
|
||||
return SqlScriptUtils.convertChoose(String.format("%s == null or !(%s instanceof %s)", Constants.WRAPPER, Constants.WRAPPER, MPJBaseJoin.class.getName()),
|
||||
super.sqlOrderBy(table), mpjSqlOrderBy(table));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String sqlSelectColumns(TableInfo table, boolean queryWrapper) {
|
||||
String selectColumns = super.sqlSelectColumns(table, queryWrapper);
|
||||
|
@ -34,6 +34,12 @@ public class SelectPage extends com.baomidou.mybatisplus.core.injector.methods.S
|
||||
super.sqlWhereEntityWrapper(newLine, table), mpjSqlWhereEntityWrapper(newLine, table));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String sqlOrderBy(TableInfo table) {
|
||||
return SqlScriptUtils.convertChoose(String.format("%s == null or !(%s instanceof %s)", Constants.WRAPPER, Constants.WRAPPER, MPJBaseJoin.class.getName()),
|
||||
super.sqlOrderBy(table), mpjSqlOrderBy(table));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String sqlSelectColumns(TableInfo table, boolean queryWrapper) {
|
||||
String selectColumns = super.sqlSelectColumns(table, queryWrapper);
|
||||
|
@ -6,7 +6,10 @@ import com.baomidou.mybatisplus.core.conditions.query.Query;
|
||||
import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments;
|
||||
import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
|
||||
import com.baomidou.mybatisplus.core.metadata.TableInfo;
|
||||
import com.baomidou.mybatisplus.core.toolkit.*;
|
||||
import com.baomidou.mybatisplus.core.toolkit.ArrayUtils;
|
||||
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
|
||||
import com.baomidou.mybatisplus.core.toolkit.StringPool;
|
||||
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
|
||||
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
|
||||
import com.github.yulichang.config.ConfigProperties;
|
||||
import com.github.yulichang.query.interfaces.StringJoin;
|
||||
@ -72,7 +75,7 @@ public class MPJLambdaQueryWrapper<T> extends AbstractLambdaWrapper<T, MPJLambda
|
||||
MPJLambdaQueryWrapper(T entity, Class<T> entityClass, SharedString from, SharedString sqlSelect, AtomicInteger paramNameSeq,
|
||||
Map<String, Object> paramNameValuePairs, MergeSegments mergeSegments,
|
||||
SharedString lastSql, SharedString sqlComment, SharedString sqlFirst,
|
||||
List<String> selectColumns, List<String> ignoreColumns) {
|
||||
List<String> selectColumns, List<String> ignoreColumns, boolean selectDistinct) {
|
||||
super.setEntity(entity);
|
||||
super.setEntityClass(entityClass);
|
||||
this.paramNameSeq = paramNameSeq;
|
||||
@ -85,6 +88,7 @@ public class MPJLambdaQueryWrapper<T> extends AbstractLambdaWrapper<T, MPJLambda
|
||||
this.sqlFirst = sqlFirst;
|
||||
this.selectColumns = selectColumns;
|
||||
this.ignoreColumns = ignoreColumns;
|
||||
this.selectDistinct = selectDistinct;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -200,7 +204,7 @@ public class MPJLambdaQueryWrapper<T> extends AbstractLambdaWrapper<T, MPJLambda
|
||||
*/
|
||||
public MPJQueryWrapper<T> stringQuery() {
|
||||
return new MPJQueryWrapper<>(getEntity(), getEntityClass(), paramNameSeq, paramNameValuePairs,
|
||||
expression, sqlSelect, from, lastSql, sqlComment, sqlFirst, selectColumns, ignoreColumns);
|
||||
expression, sqlSelect, from, lastSql, sqlComment, sqlFirst, selectColumns, ignoreColumns, selectDistinct);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -243,7 +247,7 @@ public class MPJLambdaQueryWrapper<T> extends AbstractLambdaWrapper<T, MPJLambda
|
||||
@Override
|
||||
protected MPJLambdaQueryWrapper<T> instance() {
|
||||
return new MPJLambdaQueryWrapper<>(getEntity(), getEntityClass(), null, null, paramNameSeq, paramNameValuePairs,
|
||||
new MergeSegments(), SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), null, null);
|
||||
new MergeSegments(), SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), null, null, selectDistinct);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -98,7 +98,7 @@ public class MPJQueryWrapper<T> extends AbstractWrapper<T, String, MPJQueryWrapp
|
||||
Map<String, Object> paramNameValuePairs, MergeSegments mergeSegments,
|
||||
SharedString sqlSelect, SharedString from, SharedString lastSql,
|
||||
SharedString sqlComment, SharedString sqlFirst,
|
||||
List<String> selectColumns, List<String> ignoreColumns) {
|
||||
List<String> selectColumns, List<String> ignoreColumns, boolean selectDistinct) {
|
||||
super.setEntity(entity);
|
||||
super.setEntityClass(entityClass);
|
||||
this.paramNameSeq = paramNameSeq;
|
||||
@ -111,6 +111,7 @@ public class MPJQueryWrapper<T> extends AbstractWrapper<T, String, MPJQueryWrapp
|
||||
this.sqlFirst = sqlFirst;
|
||||
this.selectColumns = selectColumns;
|
||||
this.ignoreColumns = ignoreColumns;
|
||||
this.selectDistinct = selectDistinct;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -295,7 +296,7 @@ public class MPJQueryWrapper<T> extends AbstractWrapper<T, String, MPJQueryWrapp
|
||||
*/
|
||||
public MPJLambdaQueryWrapper<T> lambda() {
|
||||
return new MPJLambdaQueryWrapper<>(getEntity(), getEntityClass(), from, sqlSelect, paramNameSeq, paramNameValuePairs,
|
||||
expression, lastSql, sqlComment, sqlFirst, selectColumns, ignoreColumns);
|
||||
expression, lastSql, sqlComment, sqlFirst, selectColumns, ignoreColumns, selectDistinct);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -305,7 +306,7 @@ public class MPJQueryWrapper<T> extends AbstractWrapper<T, String, MPJQueryWrapp
|
||||
@Override
|
||||
protected MPJQueryWrapper<T> instance() {
|
||||
return new MPJQueryWrapper<>(getEntity(), getEntityClass(), paramNameSeq, paramNameValuePairs, new MergeSegments(),
|
||||
null, null, SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), null, null);
|
||||
null, null, SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), null, null, selectDistinct);
|
||||
}
|
||||
|
||||
|
||||
|
@ -38,6 +38,13 @@ public class JoinWrappers {
|
||||
return new MPJLambdaWrapper<>();
|
||||
}
|
||||
|
||||
/**
|
||||
* JoinWrappers.<UserDO>lambda("t")
|
||||
*/
|
||||
public static <T> MPJLambdaWrapper<T> lambda(String alias) {
|
||||
return new MPJLambdaWrapper<>(alias);
|
||||
}
|
||||
|
||||
/**
|
||||
* JoinWrappers.lambda(User.class)
|
||||
*/
|
||||
@ -45,10 +52,24 @@ public class JoinWrappers {
|
||||
return new MPJLambdaWrapper<>(clazz);
|
||||
}
|
||||
|
||||
/**
|
||||
* JoinWrappers.lambda("t", User.class)
|
||||
*/
|
||||
public static <T> MPJLambdaWrapper<T> lambda(String alias, Class<T> clazz) {
|
||||
return new MPJLambdaWrapper<T>(alias).setEntityClass(clazz);
|
||||
}
|
||||
|
||||
/**
|
||||
* JoinWrappers.lambda(user)
|
||||
*/
|
||||
public static <T> MPJLambdaWrapper<T> lambda(T entity) {
|
||||
return new MPJLambdaWrapper<>(entity);
|
||||
}
|
||||
|
||||
/**
|
||||
* JoinWrappers.lambda("t", user)
|
||||
*/
|
||||
public static <T> MPJLambdaWrapper<T> lambda(String alias, T entity) {
|
||||
return new MPJLambdaWrapper<T>(alias).setEntity(entity);
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
package com.github.yulichang.toolkit;
|
||||
|
||||
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@ -92,18 +93,14 @@ public class TableList {
|
||||
public String getPrefixOther(Integer index, Class<?> clazz) {
|
||||
if (Objects.isNull(index)) {
|
||||
List<Node> list = getByClass(clazz);
|
||||
if (list.size() == 1 && list.get(0).getClazz() == clazz) {
|
||||
return alias;
|
||||
} else if (list.size() > 1) {
|
||||
if (CollectionUtils.isNotEmpty(list)) {
|
||||
for (Node n : list) {
|
||||
if (n.getClazz() == clazz) {
|
||||
return n.isHasAlias() ? n.getAlias() : (n.getAlias() + n.getIndex());
|
||||
}
|
||||
}
|
||||
return alias;
|
||||
} else {
|
||||
return alias;
|
||||
}
|
||||
return alias;
|
||||
}
|
||||
Node node = getByIndex(index);
|
||||
Node dg = dg(node, node.getClazz());
|
||||
|
@ -1,9 +1,12 @@
|
||||
package com.github.yulichang.wrapper;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.OrderBy;
|
||||
import com.baomidou.mybatisplus.core.conditions.SharedString;
|
||||
import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments;
|
||||
import com.baomidou.mybatisplus.core.metadata.TableInfo;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Constants;
|
||||
import com.baomidou.mybatisplus.core.toolkit.StringPool;
|
||||
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
|
||||
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
|
||||
import com.github.yulichang.config.ConfigProperties;
|
||||
import com.github.yulichang.config.enums.LogicDelTypeEnum;
|
||||
@ -160,6 +163,21 @@ public abstract class MPJAbstractLambdaWrapper<T, Children extends MPJAbstractLa
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否使用默认注解 {@link OrderBy} 排序
|
||||
*
|
||||
* @return true 使用 false 不使用
|
||||
*/
|
||||
public boolean isUseAnnotationOrderBy() {
|
||||
final String _sqlSegment = this.getSqlSegment();
|
||||
if (StringUtils.isBlank(_sqlSegment)) {
|
||||
return true;
|
||||
}
|
||||
final String _sqlSegmentToUpperCase = _sqlSegment.toUpperCase();
|
||||
return !(_sqlSegmentToUpperCase.contains(Constants.ORDER_BY)
|
||||
|| _sqlSegmentToUpperCase.contains(Constants.LIMIT));
|
||||
}
|
||||
|
||||
/**
|
||||
* 必要的初始化
|
||||
*/
|
||||
|
Loading…
x
Reference in New Issue
Block a user