mirror of
https://gitee.com/mybatis-flex/mybatis-flex.git
synced 2025-12-07 00:58:24 +08:00
feat: add as(lambda) support
This commit is contained in:
parent
c30158c268
commit
b557b9cc96
@ -53,9 +53,14 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public QueryColumn(String schema, String tableName, String name) {
|
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);
|
SqlUtil.keepColumnSafely(name);
|
||||||
this.table = new QueryTable(schema, tableName);
|
this.table = new QueryTable(schema, tableName);
|
||||||
this.name = name;
|
this.name = name;
|
||||||
|
this.alias = alias;
|
||||||
}
|
}
|
||||||
|
|
||||||
public QueryColumn(QueryTable queryTable, String name) {
|
public QueryColumn(QueryTable queryTable, String name) {
|
||||||
@ -65,14 +70,15 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public QueryColumn(TableDef tableDef, String name) {
|
public QueryColumn(TableDef tableDef, String name) {
|
||||||
SqlUtil.keepColumnSafely(name);
|
this(tableDef, name, null);
|
||||||
this.returnCopyByAsMethod = true;
|
|
||||||
this.table = new QueryTable(tableDef);
|
|
||||||
this.name = name;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public QueryColumn(TableDef tableDef, String name, String alias) {
|
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;
|
this.alias = alias;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -107,7 +113,7 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
|
|||||||
|
|
||||||
public QueryColumn as(String alias) {
|
public QueryColumn as(String alias) {
|
||||||
SqlUtil.keepColumnSafely(alias);
|
SqlUtil.keepColumnSafely(alias);
|
||||||
if (returnCopyByAsMethod) {
|
if (returnCopyByAsMethod || StringUtil.isNotBlank(this.alias)) {
|
||||||
QueryColumn newColumn = new QueryColumn();
|
QueryColumn newColumn = new QueryColumn();
|
||||||
newColumn.table = this.table;
|
newColumn.table = this.table;
|
||||||
newColumn.name = this.name;
|
newColumn.name = this.name;
|
||||||
|
|||||||
@ -91,6 +91,9 @@ public class TableInfo {
|
|||||||
|
|
||||||
//column 和 java 属性的称的关系映射
|
//column 和 java 属性的称的关系映射
|
||||||
private final Map<String, ColumnInfo> columnInfoMapping = new HashMap<>();
|
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 final Map<String, String> propertyColumnMapping = new HashMap<>();
|
||||||
|
|
||||||
private List<InsertListener> onInsertListeners;
|
private List<InsertListener> onInsertListeners;
|
||||||
@ -336,6 +339,9 @@ public class TableInfo {
|
|||||||
columns[i] = columnInfo.getColumn();
|
columns[i] = columnInfo.getColumn();
|
||||||
columnInfoMapping.put(columnInfo.column, columnInfo);
|
columnInfoMapping.put(columnInfo.column, columnInfo);
|
||||||
propertyColumnMapping.put(columnInfo.property, columnInfo.column);
|
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);
|
columnInfoMapping.put(idInfo.column, idInfo);
|
||||||
propertyColumnMapping.put(idInfo.property, idInfo.column);
|
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]);
|
this.insertPrimaryKeys = insertIdFields.toArray(new String[0]);
|
||||||
}
|
}
|
||||||
@ -773,7 +782,7 @@ public class TableInfo {
|
|||||||
|
|
||||||
public List<QueryColumn> getDefaultQueryColumn() {
|
public List<QueryColumn> getDefaultQueryColumn() {
|
||||||
return Arrays.stream(defaultColumns)
|
return Arrays.stream(defaultColumns)
|
||||||
.map(name -> new QueryColumn(schema, getTableName(), name))
|
.map(name -> columnQueryMapping.get(name))
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1126,6 +1135,7 @@ public class TableInfo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public QueryColumn getQueryColumnByProperty(String property) {
|
public QueryColumn getQueryColumnByProperty(String property) {
|
||||||
return new QueryColumn(schema, tableName, propertyColumnMapping.get(property));
|
String column = getColumnByProperty(property);
|
||||||
|
return columnQueryMapping.get(column);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -22,7 +22,6 @@ import com.mybatisflex.core.table.TableInfoFactory;
|
|||||||
import org.apache.ibatis.reflection.property.PropertyNamer;
|
import org.apache.ibatis.reflection.property.PropertyNamer;
|
||||||
import org.apache.ibatis.util.MapUtil;
|
import org.apache.ibatis.util.MapUtil;
|
||||||
|
|
||||||
import java.io.Serializable;
|
|
||||||
import java.lang.invoke.SerializedLambda;
|
import java.lang.invoke.SerializedLambda;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -45,14 +44,14 @@ public class LambdaUtil {
|
|||||||
|
|
||||||
public static <T> String getAliasName(LambdaGetter<T> getter) {
|
public static <T> String getAliasName(LambdaGetter<T> getter) {
|
||||||
QueryColumn queryColumn = getQueryColumn(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) {
|
public static <T> QueryColumn getQueryColumn(LambdaGetter<T> getter) {
|
||||||
SerializedLambda lambda = getSerializedLambda(getter);
|
SerializedLambda lambda = getSerializedLambda(getter);
|
||||||
String methodName = lambda.getImplMethodName();
|
String methodName = lambda.getImplMethodName();
|
||||||
String implClass = lambda.getImplClass();
|
String implClass = getImplClass(lambda);
|
||||||
Class<?> entityClass = MapUtil.computeIfAbsent(classMap, implClass, s -> {
|
Class<?> entityClass = MapUtil.computeIfAbsent(classMap, implClass, s -> {
|
||||||
try {
|
try {
|
||||||
return Class.forName(s.replace("/", "."));
|
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 -> {
|
return MapUtil.computeIfAbsent(lambdaMap, getter.getClass(), aClass -> {
|
||||||
try {
|
try {
|
||||||
Method method = getter.getClass().getDeclaredMethod("writeReplace");
|
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(";"));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -25,14 +25,16 @@ import com.mybatisflex.annotation.As;
|
|||||||
public class AccountVO2 extends IdEntity<Long> {
|
public class AccountVO2 extends IdEntity<Long> {
|
||||||
|
|
||||||
private Integer age;
|
private Integer age;
|
||||||
|
|
||||||
@As("account_name")
|
@As("account_name")
|
||||||
private String userName;
|
private String userName;
|
||||||
private UserVO4 user;
|
private UserVO4 user;
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@As("account_id")
|
@As("account_id")
|
||||||
public void setId(Long id) {
|
public Long getId() {
|
||||||
super.setId(id);
|
return super.getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Integer getAge() {
|
public Integer getAge() {
|
||||||
|
|||||||
@ -130,4 +130,19 @@ class AccountMapperTest {
|
|||||||
System.out.println(account);
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user