diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryColumn.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryColumn.java index 7b7cf5d4..e4ed29f7 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryColumn.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryColumn.java @@ -53,9 +53,14 @@ public class QueryColumn implements CloneSupport { } public QueryColumn(String schema, String tableName, String name) { + this(schema, tableName, name, null); + } + + public QueryColumn(String schema, String tableName, String name, String alias) { SqlUtil.keepColumnSafely(name); this.table = new QueryTable(schema, tableName); this.name = name; + this.alias = alias; } public QueryColumn(QueryTable queryTable, String name) { @@ -65,14 +70,15 @@ public class QueryColumn implements CloneSupport { } public QueryColumn(TableDef tableDef, String name) { - SqlUtil.keepColumnSafely(name); - this.returnCopyByAsMethod = true; - this.table = new QueryTable(tableDef); - this.name = name; + this(tableDef, name, null); } public QueryColumn(TableDef tableDef, String name, String alias) { - this(tableDef, name); + SqlUtil.keepColumnSafely(name); + + this.returnCopyByAsMethod = true; + this.table = new QueryTable(tableDef); + this.name = name; this.alias = alias; } @@ -107,7 +113,7 @@ public class QueryColumn implements CloneSupport { public QueryColumn as(String alias) { SqlUtil.keepColumnSafely(alias); - if (returnCopyByAsMethod) { + if (returnCopyByAsMethod || StringUtil.isNotBlank(this.alias)) { QueryColumn newColumn = new QueryColumn(); newColumn.table = this.table; newColumn.name = this.name; diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfo.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfo.java index b943e3c6..70696a76 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfo.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfo.java @@ -91,6 +91,9 @@ public class TableInfo { //column 和 java 属性的称的关系映射 private final Map columnInfoMapping = new HashMap<>(); + private final Map columnQueryMapping = new HashMap<>(); + + //property:column private final Map propertyColumnMapping = new HashMap<>(); private List onInsertListeners; @@ -336,6 +339,9 @@ public class TableInfo { columns[i] = columnInfo.getColumn(); columnInfoMapping.put(columnInfo.column, columnInfo); propertyColumnMapping.put(columnInfo.property, columnInfo.column); + + String[] alias = columnInfo.getAlias(); + columnQueryMapping.put(columnInfo.column, new QueryColumn(schema, tableName, columnInfo.column, alias != null && alias.length > 0 ? alias[0] : null)); } } @@ -359,6 +365,9 @@ public class TableInfo { columnInfoMapping.put(idInfo.column, idInfo); propertyColumnMapping.put(idInfo.property, idInfo.column); + + String[] alias = idInfo.getAlias(); + columnQueryMapping.put(idInfo.column, new QueryColumn(schema, tableName, idInfo.column, alias != null && alias.length > 0 ? alias[0] : null)); } this.insertPrimaryKeys = insertIdFields.toArray(new String[0]); } @@ -773,7 +782,7 @@ public class TableInfo { public List getDefaultQueryColumn() { return Arrays.stream(defaultColumns) - .map(name -> new QueryColumn(schema, getTableName(), name)) + .map(name -> columnQueryMapping.get(name)) .collect(Collectors.toList()); } @@ -1126,6 +1135,7 @@ public class TableInfo { } public QueryColumn getQueryColumnByProperty(String property) { - return new QueryColumn(schema, tableName, propertyColumnMapping.get(property)); + String column = getColumnByProperty(property); + return columnQueryMapping.get(column); } } diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/LambdaUtil.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/LambdaUtil.java index cc294463..cd6ea696 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/LambdaUtil.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/LambdaUtil.java @@ -22,7 +22,6 @@ import com.mybatisflex.core.table.TableInfoFactory; import org.apache.ibatis.reflection.property.PropertyNamer; import org.apache.ibatis.util.MapUtil; -import java.io.Serializable; import java.lang.invoke.SerializedLambda; import java.lang.reflect.Method; import java.util.Map; @@ -45,17 +44,17 @@ public class LambdaUtil { public static String getAliasName(LambdaGetter getter) { QueryColumn queryColumn = getQueryColumn(getter); - return queryColumn.getAlias(); + return StringUtil.isNotBlank(queryColumn.getAlias()) ? queryColumn.getAlias() : queryColumn.getName(); } public static QueryColumn getQueryColumn(LambdaGetter getter) { SerializedLambda lambda = getSerializedLambda(getter); String methodName = lambda.getImplMethodName(); - String implClass = lambda.getImplClass(); + String implClass = getImplClass(lambda); Class entityClass = MapUtil.computeIfAbsent(classMap, implClass, s -> { try { - return Class.forName(s.replace("/",".")); + return Class.forName(s.replace("/", ".")); } catch (ClassNotFoundException e) { throw FlexExceptions.wrap(e); } @@ -65,7 +64,7 @@ public class LambdaUtil { } - private static SerializedLambda getSerializedLambda(Serializable getter) { + private static SerializedLambda getSerializedLambda(LambdaGetter getter) { return MapUtil.computeIfAbsent(lambdaMap, getter.getClass(), aClass -> { try { Method method = getter.getClass().getDeclaredMethod("writeReplace"); @@ -77,4 +76,10 @@ public class LambdaUtil { }); } + + public static String getImplClass(SerializedLambda lambda) { + String type = lambda.getInstantiatedMethodType(); + return type.substring(2, type.indexOf(";")); + } + } diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/AccountVO2.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/AccountVO2.java index 89611509..16a7e602 100644 --- a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/AccountVO2.java +++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/AccountVO2.java @@ -25,14 +25,16 @@ import com.mybatisflex.annotation.As; public class AccountVO2 extends IdEntity { private Integer age; + @As("account_name") private String userName; private UserVO4 user; + @Override @As("account_id") - public void setId(Long id) { - super.setId(id); + public Long getId() { + return super.getId(); } public Integer getAge() { diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/AccountMapperTest.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/AccountMapperTest.java index 2c523cd6..59b38d91 100644 --- a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/AccountMapperTest.java +++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/AccountMapperTest.java @@ -130,4 +130,19 @@ class AccountMapperTest { System.out.println(account); } + @Test + void testAs1() { + QueryWrapper queryWrapper = QueryWrapper.create() + .select(ACCOUNT.ID.as(AccountVO2::getId), + ACCOUNT.AGE, + concat(column("'account name: '"), ACCOUNT.USER_NAME).as(AccountVO2::getUserName), + USER.USER_ID, + concat(column("'user name: '"), USER.USER_NAME).as("1_account_name")) + .from(ACCOUNT.as("a"), USER.as("u")) + .where(ACCOUNT.ID.eq(1)) + .limit(1); + AccountVO2 account = accountMapper.selectOneByQueryAs(queryWrapper, AccountVO2.class); + System.out.println(account); + } + } \ No newline at end of file