From 0203cb76bdf532332616830d5045af121f07400b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=80=E6=BA=90=E6=B5=B7=E5=93=A5?= Date: Sun, 23 Jul 2023 10:32:15 +0800 Subject: [PATCH] feat: add selectColumns config for `@Relation` annotations --- .../annotation/RelationManyToMany.java | 5 +++ .../annotation/RelationManyToOne.java | 5 +++ .../annotation/RelationOneToMany.java | 6 ++++ .../annotation/RelationOneToOne.java | 5 +++ .../core/relation/AbstractRelation.java | 34 +++++++++++++++---- .../mybatisflex/core/relation/ManyToMany.java | 3 +- .../mybatisflex/core/relation/ManyToOne.java | 3 +- .../mybatisflex/core/relation/OneToMany.java | 5 ++- .../mybatisflex/core/relation/OneToOne.java | 3 +- .../core/relation/ToManyRelation.java | 9 +++-- .../core/relation/ToOneRelation.java | 4 +-- .../mybatisflex/core/util/FieldWrapper.java | 6 ++++ 12 files changed, 71 insertions(+), 17 deletions(-) diff --git a/mybatis-flex-annotation/src/main/java/com/mybatisflex/annotation/RelationManyToMany.java b/mybatis-flex-annotation/src/main/java/com/mybatisflex/annotation/RelationManyToMany.java index 06b86fa4..41990ae9 100644 --- a/mybatis-flex-annotation/src/main/java/com/mybatisflex/annotation/RelationManyToMany.java +++ b/mybatis-flex-annotation/src/main/java/com/mybatisflex/annotation/RelationManyToMany.java @@ -99,6 +99,11 @@ public @interface RelationManyToMany { */ String extraCondition() default ""; + /** + * 查询(加载)指定的列 + */ + String[] selectColumns() default {}; + /** * 查询排序。 * diff --git a/mybatis-flex-annotation/src/main/java/com/mybatisflex/annotation/RelationManyToOne.java b/mybatis-flex-annotation/src/main/java/com/mybatisflex/annotation/RelationManyToOne.java index 5d3e8b11..cfbb8d0d 100644 --- a/mybatis-flex-annotation/src/main/java/com/mybatisflex/annotation/RelationManyToOne.java +++ b/mybatis-flex-annotation/src/main/java/com/mybatisflex/annotation/RelationManyToOne.java @@ -95,4 +95,9 @@ public @interface RelationManyToOne { */ String dataSource() default ""; + /** + * 查询(加载)指定的列 + */ + String[] selectColumns() default {}; + } diff --git a/mybatis-flex-annotation/src/main/java/com/mybatisflex/annotation/RelationOneToMany.java b/mybatis-flex-annotation/src/main/java/com/mybatisflex/annotation/RelationOneToMany.java index 36c77a03..9fefdf44 100644 --- a/mybatis-flex-annotation/src/main/java/com/mybatisflex/annotation/RelationOneToMany.java +++ b/mybatis-flex-annotation/src/main/java/com/mybatisflex/annotation/RelationOneToMany.java @@ -99,6 +99,11 @@ public @interface RelationOneToMany { */ String extraCondition() default ""; + /** + * 查询(加载)指定的列 + */ + String[] selectColumns() default {}; + /** * 查询排序。 * @@ -120,4 +125,5 @@ public @interface RelationOneToMany { */ String dataSource() default ""; + } diff --git a/mybatis-flex-annotation/src/main/java/com/mybatisflex/annotation/RelationOneToOne.java b/mybatis-flex-annotation/src/main/java/com/mybatisflex/annotation/RelationOneToOne.java index 47aacdae..528e910c 100644 --- a/mybatis-flex-annotation/src/main/java/com/mybatisflex/annotation/RelationOneToOne.java +++ b/mybatis-flex-annotation/src/main/java/com/mybatisflex/annotation/RelationOneToOne.java @@ -95,4 +95,9 @@ public @interface RelationOneToOne { */ String dataSource() default ""; + /** + * 查询(加载)指定的列 + */ + String[] selectColumns() default {}; + } diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/relation/AbstractRelation.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/relation/AbstractRelation.java index ab61abc7..b6344011 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/relation/AbstractRelation.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/relation/AbstractRelation.java @@ -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 { protected String extraConditionSql; protected List 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 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 { 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 { * @return QueryWrapper */ public QueryWrapper buildQueryWrapper(Set 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 { /** - * 方便子类最近自定义的条件 + * 方便子类追加自定义的条件 * * @param queryWrapper 查询条件 */ diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/relation/ManyToMany.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/relation/ManyToMany.java index a57bf92c..7fcddb21 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/relation/ManyToMany.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/relation/ManyToMany.java @@ -30,7 +30,8 @@ class ManyToMany extends ToManyRelation { , annotation.joinSelfColumn() , annotation.joinTargetColumn() , annotation.dataSource(), entityClass, relationField - , annotation.extraCondition()); + , annotation.extraCondition() + , annotation.selectColumns()); this.orderBy = annotation.orderBy(); this.setMapKeyField(annotation.mapKeyField()); diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/relation/ManyToOne.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/relation/ManyToOne.java index 05fe5262..45d71ac8 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/relation/ManyToOne.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/relation/ManyToOne.java @@ -32,7 +32,8 @@ class ManyToOne extends ToOneRelation { , annotation.joinTargetColumn() , annotation.dataSource() , entityClass - , relationField); + , relationField + , annotation.selectColumns()); } diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/relation/OneToMany.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/relation/OneToMany.java index 4e6afbec..fc5a642c 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/relation/OneToMany.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/relation/OneToMany.java @@ -31,7 +31,8 @@ class OneToMany extends ToManyRelation { , 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 extends ToManyRelation { } - - } diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/relation/OneToOne.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/relation/OneToOne.java index 2cd38c37..9e410ec0 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/relation/OneToOne.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/relation/OneToOne.java @@ -32,7 +32,8 @@ class OneToOne extends ToOneRelation { , annotation.joinTargetColumn() , annotation.dataSource() , entityClass - , relationField); + , relationField + , annotation.selectColumns()); } } diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/relation/ToManyRelation.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/relation/ToManyRelation.java index f855bacc..95bac0a1 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/relation/ToManyRelation.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/relation/ToManyRelation.java @@ -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 extends AbstractRelation { public ToManyRelation(String selfField, String targetSchema, String targetTable, String targetField, String joinTable, String joinSelfColumn, String joinTargetColumn, String dataSource, Class 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 extends AbstractRelation { 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()); + } } } diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/relation/ToOneRelation.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/relation/ToOneRelation.java index 324e9efb..86690955 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/relation/ToOneRelation.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/relation/ToOneRelation.java @@ -25,11 +25,11 @@ class ToOneRelation extends AbstractRelation { public ToOneRelation(String selfField, String targetSchema, String targetTable, String targetField, String joinTable, String joinSelfColumn, String joinTargetColumn, - String dataSource, Class selfEntityClass, Field relationField) { + String dataSource, Class selfEntityClass, Field relationField, String[] selectColumns) { super(selfField, targetSchema, targetTable, targetField, joinTable, joinSelfColumn, joinTargetColumn, dataSource, selfEntityClass, relationField, - null + null, selectColumns ); } diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/FieldWrapper.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/FieldWrapper.java index 735470c0..f645e6c2 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/FieldWrapper.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/FieldWrapper.java @@ -26,6 +26,7 @@ public class FieldWrapper { public static Map, Map> 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; + } }