feat: add as(lambda) support

This commit is contained in:
开源海哥 2023-07-02 13:17:09 +08:00
parent c30158c268
commit b557b9cc96
5 changed files with 53 additions and 15 deletions

View File

@ -53,9 +53,14 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
}
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<QueryColumn> {
}
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<QueryColumn> {
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;

View File

@ -91,6 +91,9 @@ public class TableInfo {
//column java 属性的称的关系映射
private final Map<String, ColumnInfo> columnInfoMapping = new HashMap<>();
private final Map<String, QueryColumn> columnQueryMapping = new HashMap<>();
//property:column
private final Map<String, String> propertyColumnMapping = new HashMap<>();
private List<InsertListener> 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<QueryColumn> 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);
}
}

View File

@ -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,14 +44,14 @@ public class LambdaUtil {
public static <T> String getAliasName(LambdaGetter<T> getter) {
QueryColumn queryColumn = getQueryColumn(getter);
return queryColumn.getAlias();
return StringUtil.isNotBlank(queryColumn.getAlias()) ? queryColumn.getAlias() : queryColumn.getName();
}
public static <T> QueryColumn getQueryColumn(LambdaGetter<T> 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("/", "."));
@ -65,7 +64,7 @@ public class LambdaUtil {
}
private static SerializedLambda getSerializedLambda(Serializable getter) {
private static <T> SerializedLambda getSerializedLambda(LambdaGetter<T> 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(";"));
}
}

View File

@ -25,14 +25,16 @@ import com.mybatisflex.annotation.As;
public class AccountVO2 extends IdEntity<Long> {
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() {

View File

@ -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);
}
}