feat: add selectColumns config for @Relation annotations

This commit is contained in:
开源海哥 2023-07-23 10:32:15 +08:00
parent 198db373c5
commit 0203cb76bd
12 changed files with 71 additions and 17 deletions

View File

@ -99,6 +99,11 @@ public @interface RelationManyToMany {
*/
String extraCondition() default "";
/**
* 查询加载指定的列
*/
String[] selectColumns() default {};
/**
* 查询排序
*

View File

@ -95,4 +95,9 @@ public @interface RelationManyToOne {
*/
String dataSource() default "";
/**
* 查询加载指定的列
*/
String[] selectColumns() default {};
}

View File

@ -99,6 +99,11 @@ public @interface RelationOneToMany {
*/
String extraCondition() default "";
/**
* 查询加载指定的列
*/
String[] selectColumns() default {};
/**
* 查询排序
*
@ -120,4 +125,5 @@ public @interface RelationOneToMany {
*/
String dataSource() default "";
}

View File

@ -95,4 +95,9 @@ public @interface RelationOneToOne {
*/
String dataSource() default "";
/**
* 查询加载指定的列
*/
String[] selectColumns() default {};
}

View File

@ -16,11 +16,13 @@
package com.mybatisflex.core.relation;
import com.mybatisflex.core.exception.FlexExceptions;
import com.mybatisflex.core.query.QueryColumn;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.row.Row;
import com.mybatisflex.core.table.IdInfo;
import com.mybatisflex.core.table.TableInfo;
import com.mybatisflex.core.table.TableInfoFactory;
import com.mybatisflex.core.util.ArrayUtil;
import com.mybatisflex.core.util.ClassUtil;
import com.mybatisflex.core.util.FieldWrapper;
import com.mybatisflex.core.util.StringUtil;
@ -57,10 +59,13 @@ abstract class AbstractRelation<SelfEntity> {
protected String extraConditionSql;
protected List<String> extraConditionParamKeys;
protected QueryColumn conditionColumn;
protected String[] selectColumns;
public AbstractRelation(String selfField, String targetSchema, String targetTable, String targetField,
String joinTable, String joinSelfColumn, String joinTargetColumn,
String dataSource, Class<SelfEntity> entityClass, Field relationField,
String extraCondition
String extraCondition, String[] selectColumns
) {
this.name = entityClass.getSimpleName() + "." + relationField.getName();
this.simpleName = relationField.getName();
@ -87,6 +92,17 @@ abstract class AbstractRelation<SelfEntity> {
this.targetTableInfo = TableInfoFactory.ofEntityClass(targetEntityClass);
this.conditionColumn = column(targetTableInfo.getColumnByProperty(this.targetField.getName()));
if (ArrayUtil.isNotEmpty(selectColumns)) {
if (ArrayUtil.contains(selectColumns, conditionColumn.getName())) {
this.selectColumns = selectColumns;
} else {
//需要追加 conditionColumn因为进行内存 join 的时候需要用到这个内容进行对比
this.selectColumns = ArrayUtil.concat(selectColumns, new String[]{conditionColumn.getName()});
}
}
initExtraCondition(extraCondition);
}
@ -323,14 +339,18 @@ abstract class AbstractRelation<SelfEntity> {
* @return QueryWrapper
*/
public QueryWrapper buildQueryWrapper(Set<Object> targetValues) {
QueryWrapper queryWrapper = QueryWrapper.create()
.select()
.from(getTargetTableWithSchema());
QueryWrapper queryWrapper = QueryWrapper.create();
if (ArrayUtil.isNotEmpty(selectColumns)) {
queryWrapper.select(selectColumns);
}
queryWrapper.from(getTargetTableWithSchema());
if (targetValues.size() > 1) {
queryWrapper.where(column(targetTableInfo.getColumnByProperty(targetField.getName())).in(targetValues));
queryWrapper.where(conditionColumn.in(targetValues));
} else {
queryWrapper.where(column(targetTableInfo.getColumnByProperty(targetField.getName())).eq(targetValues.iterator().next()));
queryWrapper.where(conditionColumn.eq(targetValues.iterator().next()));
}
if (StringUtil.isNotBlank(extraConditionSql)) {
@ -344,7 +364,7 @@ abstract class AbstractRelation<SelfEntity> {
/**
* 方便子类最近自定义的条件
* 方便子类追加自定义的条件
*
* @param queryWrapper 查询条件
*/

View File

@ -30,7 +30,8 @@ class ManyToMany<SelfEntity> extends ToManyRelation<SelfEntity> {
, annotation.joinSelfColumn()
, annotation.joinTargetColumn()
, annotation.dataSource(), entityClass, relationField
, annotation.extraCondition());
, annotation.extraCondition()
, annotation.selectColumns());
this.orderBy = annotation.orderBy();
this.setMapKeyField(annotation.mapKeyField());

View File

@ -32,7 +32,8 @@ class ManyToOne<SelfEntity> extends ToOneRelation<SelfEntity> {
, annotation.joinTargetColumn()
, annotation.dataSource()
, entityClass
, relationField);
, relationField
, annotation.selectColumns());
}

View File

@ -31,7 +31,8 @@ class OneToMany<SelfEntity> extends ToManyRelation<SelfEntity> {
, annotation.joinSelfColumn()
, annotation.joinTargetColumn()
, annotation.dataSource(), entityClass, relationField
, annotation.extraCondition());
, annotation.extraCondition()
, annotation.selectColumns());
this.orderBy = annotation.orderBy();
this.limit = annotation.limit();
@ -40,6 +41,4 @@ class OneToMany<SelfEntity> extends ToManyRelation<SelfEntity> {
}
}

View File

@ -32,7 +32,8 @@ class OneToOne<SelfEntity> extends ToOneRelation<SelfEntity> {
, annotation.joinTargetColumn()
, annotation.dataSource()
, entityClass
, relationField);
, relationField
, annotation.selectColumns());
}
}

View File

@ -15,6 +15,7 @@
*/
package com.mybatisflex.core.relation;
import com.mybatisflex.core.exception.FlexExceptions;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.row.Row;
import com.mybatisflex.core.util.*;
@ -33,11 +34,11 @@ class ToManyRelation<SelfEntity> extends AbstractRelation<SelfEntity> {
public ToManyRelation(String selfField, String targetSchema, String targetTable, String targetField,
String joinTable, String joinSelfColumn, String joinTargetColumn,
String dataSource, Class<SelfEntity> selfEntityClass, Field relationField,
String extraCondition) {
String extraCondition, String[] selectColumns) {
super(selfField, targetSchema, targetTable, targetField,
joinTable, joinSelfColumn, joinTargetColumn,
dataSource, selfEntityClass, relationField,
extraCondition
extraCondition, selectColumns
);
}
@ -113,6 +114,10 @@ class ToManyRelation<SelfEntity> extends AbstractRelation<SelfEntity> {
this.mapKeyField = mapKeyField;
if (StringUtil.isNotBlank(mapKeyField)) {
this.mapKeyFieldWrapper = FieldWrapper.of(targetEntityClass, mapKeyField);
} else {
if (Map.class.isAssignableFrom(relationFieldWrapper.getFieldType())) {
throw FlexExceptions.wrap("Please config mapKeyField for map field: " + relationFieldWrapper.getField());
}
}
}

View File

@ -25,11 +25,11 @@ class ToOneRelation<SelfEntity> extends AbstractRelation<SelfEntity> {
public ToOneRelation(String selfField, String targetSchema, String targetTable, String targetField,
String joinTable, String joinSelfColumn, String joinTargetColumn,
String dataSource, Class<SelfEntity> selfEntityClass, Field relationField) {
String dataSource, Class<SelfEntity> selfEntityClass, Field relationField, String[] selectColumns) {
super(selfField, targetSchema, targetTable, targetField,
joinTable, joinSelfColumn, joinTargetColumn,
dataSource, selfEntityClass, relationField,
null
null, selectColumns
);
}

View File

@ -26,6 +26,7 @@ public class FieldWrapper {
public static Map<Class<?>, Map<String, FieldWrapper>> cache = new ConcurrentHashMap<>();
private Field field;
private Class<?> fieldType;
private Class<?> mappingType;
private Class<?> keyType;
@ -64,6 +65,7 @@ public class FieldWrapper {
}
fieldWrapper = new FieldWrapper();
fieldWrapper.field = findField;
fieldWrapper.fieldType = findField.getType();
initMappingTypeAndKeyType(clazz, findField, fieldWrapper);
@ -132,4 +134,8 @@ public class FieldWrapper {
public Class<?> getKeyType() {
return keyType;
}
public Field getField() {
return field;
}
}