From 41c30e9cfc7b51bec2ac3eaf17670f49f166a761 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=80=E6=BA=90=E6=B5=B7=E5=93=A5?= Date: Fri, 7 Jul 2023 10:50:58 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=B8=BB=E9=94=AE=E7=9A=84?= =?UTF-8?q?=E7=9C=81=E7=95=A5=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../annotation/RelationManyToMany.java | 4 +-- .../annotation/RelationManyToOne.java | 4 +-- .../annotation/RelationOneToMany.java | 2 +- .../annotation/RelationOneToOne.java | 2 +- .../core/dialect/impl/CommonsDialectImpl.java | 14 +++++----- .../mybatisflex/core/relation/ManyToMany.java | 4 ++- .../mybatisflex/core/relation/ManyToOne.java | 3 +- .../mybatisflex/core/relation/OneToMany.java | 3 +- .../mybatisflex/core/relation/OneToOne.java | 3 +- .../mybatisflex/core/relation/Relation.java | 18 ++++++++++++ .../com/mybatisflex/core/table/TableInfo.java | 28 +++++++++---------- .../test/relation/onetoone/Account.java | 13 +++++++-- 12 files changed, 64 insertions(+), 34 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 e778a2f0..82357b3e 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 @@ -22,9 +22,9 @@ import java.lang.annotation.*; @Target({ElementType.FIELD}) public @interface RelationManyToMany { - String selfField(); + String selfField() default ""; - String targetField(); + String targetField() default ""; String joinTable(); 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 afe56708..0cef9026 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 @@ -22,8 +22,8 @@ import java.lang.annotation.*; @Target({ElementType.FIELD}) public @interface RelationManyToOne { - String selfField(); + String selfField() default ""; String targetField(); - + } \ No newline at end of file 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 983b7f10..2fa801e9 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 @@ -22,7 +22,7 @@ import java.lang.annotation.*; @Target({ElementType.FIELD}) public @interface RelationOneToMany { - String selfField(); + String selfField() default ""; String targetField(); 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 9536ba16..1268a124 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 @@ -22,7 +22,7 @@ import java.lang.annotation.*; @Target({ElementType.FIELD}) public @interface RelationOneToOne { - String selfField(); + String selfField() default ""; String targetField(); diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/impl/CommonsDialectImpl.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/impl/CommonsDialectImpl.java index cbcdd4db..adee67fa 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/impl/CommonsDialectImpl.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/impl/CommonsDialectImpl.java @@ -587,7 +587,7 @@ public class CommonsDialectImpl implements IDialect { Object[] tenantIdArgs = tableInfo.buildTenantIdArgs(); //正常删除 if (StringUtil.isBlank(logicDeleteColumn)) { - String deleteByIdSql = forDeleteById(tableInfo.getSchema(), tableInfo.getTableName(), tableInfo.getPrimaryKeys()); + String deleteByIdSql = forDeleteById(tableInfo.getSchema(), tableInfo.getTableName(), tableInfo.getPrimaryColumns()); if (ArrayUtil.isNotEmpty(tenantIdArgs)) { deleteByIdSql += AND + wrap(tableInfo.getTenantIdColumn()) + IN + buildQuestion(tenantIdArgs.length); @@ -597,7 +597,7 @@ public class CommonsDialectImpl implements IDialect { //逻辑删除 StringBuilder sql = new StringBuilder(); - String[] primaryKeys = tableInfo.getPrimaryKeys(); + String[] primaryKeys = tableInfo.getPrimaryColumns(); sql.append(UPDATE).append(tableInfo.getWrapSchemaAndTableName(this)); sql.append(SET).append(buildLogicDeletedSet(logicDeleteColumn)); @@ -627,7 +627,7 @@ public class CommonsDialectImpl implements IDialect { //正常删除 if (StringUtil.isBlank(logicDeleteColumn)) { - String deleteSQL = forDeleteBatchByIds(tableInfo.getSchema(), tableInfo.getTableName(), tableInfo.getPrimaryKeys(), primaryValues); + String deleteSQL = forDeleteBatchByIds(tableInfo.getSchema(), tableInfo.getTableName(), tableInfo.getPrimaryColumns(), primaryValues); //多租户 if (ArrayUtil.isNotEmpty(tenantIdArgs)) { @@ -644,7 +644,7 @@ public class CommonsDialectImpl implements IDialect { sql.append(WHERE); sql.append(BRACKET_LEFT); - String[] primaryKeys = tableInfo.getPrimaryKeys(); + String[] primaryKeys = tableInfo.getPrimaryColumns(); //多主键的场景 if (primaryKeys.length > 1) { @@ -722,7 +722,7 @@ public class CommonsDialectImpl implements IDialect { Set updateColumns = tableInfo.obtainUpdateColumns(entity, ignoreNulls, false); Map rawValueMap = tableInfo.obtainUpdateRawValueMap(entity); - String[] primaryKeys = tableInfo.getPrimaryKeys(); + String[] primaryKeys = tableInfo.getPrimaryColumns(); sql.append(UPDATE).append(tableInfo.getWrapSchemaAndTableName(this)).append(SET); @@ -907,7 +907,7 @@ public class CommonsDialectImpl implements IDialect { buildSelectColumnSql(sql, null, null, null); sql.append(FROM).append(tableInfo.getWrapSchemaAndTableName(this)); sql.append(WHERE); - String[] pKeys = tableInfo.getPrimaryKeys(); + String[] pKeys = tableInfo.getPrimaryColumns(); for (int i = 0; i < pKeys.length; i++) { if (i > 0) { sql.append(AND); @@ -937,7 +937,7 @@ public class CommonsDialectImpl implements IDialect { buildSelectColumnSql(sql, null, tableInfo.getDefaultQueryColumn(), null); sql.append(FROM).append(tableInfo.getWrapSchemaAndTableName(this)); sql.append(WHERE); - String[] primaryKeys = tableInfo.getPrimaryKeys(); + String[] primaryKeys = tableInfo.getPrimaryColumns(); String logicDeleteColumn = tableInfo.getLogicDeleteColumnOrSkip(); Object[] tenantIdArgs = tableInfo.buildTenantIdArgs(); 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 0fda7a53..be927ca8 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 @@ -38,7 +38,9 @@ class ManyToMany extends Relation { private String orderBy; public ManyToMany(RelationManyToMany annotation, Class entityClass, Field relationField) { - super(annotation.selfField(), annotation.targetField(), entityClass, relationField); + super(getDefaultPrimaryProperty(annotation.selfField(), entityClass, "@RelationOneToMany.selfField can not be empty in field: \"" + entityClass.getName() + "." + relationField.getName() + "\""), + getDefaultPrimaryProperty(annotation.targetField(), entityClass, "@RelationOneToMany.targetField can not be empty in field: \"" + entityClass.getName() + "." + relationField.getName() + "\""), + entityClass, relationField); this.joinTable = annotation.joinTable(); this.joinSelfColumn = annotation.joinSelfColumn(); 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 2a872b82..5a980447 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 @@ -28,7 +28,8 @@ import static com.mybatisflex.core.query.QueryMethods.column; class ManyToOne extends Relation { public ManyToOne(RelationManyToOne annotation, Class entityClass, Field relationField) { - super(annotation.selfField(), annotation.targetField(), entityClass, relationField); + super(getDefaultPrimaryProperty(annotation.selfField(), entityClass, "@RelationOneToMany.selfField can not be empty in field: \"" + entityClass.getName() + "." + relationField.getName() + "\""), + annotation.targetField(), entityClass, relationField); } @Override 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 b9b388ba..c8f3f0ab 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 @@ -36,7 +36,8 @@ class OneToMany extends Relation { public OneToMany(RelationOneToMany annotation, Class entityClass, Field relationField) { - super(annotation.selfField(), annotation.targetField(), entityClass, relationField); + super(getDefaultPrimaryProperty(annotation.selfField(),entityClass,"@RelationOneToMany.selfField can not be empty in field: \"" + entityClass.getName() + "." + relationField.getName() + "\""), + annotation.targetField(), entityClass, relationField); this.orderBy = annotation.orderBy(); this.limit = annotation.limit(); } 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 f919a2f1..fdf615e4 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 @@ -28,7 +28,8 @@ import static com.mybatisflex.core.query.QueryMethods.column; class OneToOne extends Relation { public OneToOne(RelationOneToOne annotation, Class entityClass, Field relationField) { - super(annotation.selfField(), annotation.targetField(), entityClass, relationField); + super(getDefaultPrimaryProperty(annotation.selfField(), entityClass, "@RelationOneToOne.selfField can not be empty in field: \"" + entityClass.getName() + "." + relationField.getName() + "\""), + annotation.targetField(), entityClass, relationField); } diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/relation/Relation.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/relation/Relation.java index 68be5e3b..b894db61 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/relation/Relation.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/relation/Relation.java @@ -16,11 +16,14 @@ package com.mybatisflex.core.relation; import com.mybatisflex.core.BaseMapper; +import com.mybatisflex.core.exception.FlexExceptions; import com.mybatisflex.core.query.QueryWrapper; +import com.mybatisflex.core.table.IdInfo; import com.mybatisflex.core.table.TableInfo; import com.mybatisflex.core.table.TableInfoFactory; import com.mybatisflex.core.util.ClassUtil; import com.mybatisflex.core.util.FieldWrapper; +import com.mybatisflex.core.util.StringUtil; import org.apache.ibatis.reflection.Reflector; import org.apache.ibatis.reflection.TypeParameterResolver; @@ -167,4 +170,19 @@ abstract class Relation { public Class getMappingType() { return relationFieldWrapper.getMappingType(); } + + + protected static String getDefaultPrimaryProperty(String key,Class entityClass,String message){ + if (StringUtil.isNotBlank(key)){ + return key; + } + + TableInfo tableInfo = TableInfoFactory.ofEntityClass(entityClass); + List primaryKeyList = tableInfo.getPrimaryKeyList(); + if (primaryKeyList == null || primaryKeyList.size() != 1){ + throw FlexExceptions.wrap(message); + } + + return primaryKeyList.get(0).getProperty(); + } } 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 a0247921..87c8b6ce 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 @@ -78,7 +78,7 @@ public class TableInfo { private String[] columns = new String[0]; //主键字段 - private String[] primaryKeys = new String[0]; + private String[] primaryColumns = new String[0]; // 默认查询列 private String[] defaultColumns = new String[0]; @@ -261,12 +261,12 @@ public class TableInfo { this.columns = columns; } - public String[] getPrimaryKeys() { - return primaryKeys; + public String[] getPrimaryColumns() { + return primaryColumns; } - public void setPrimaryKeys(String[] primaryKeys) { - this.primaryKeys = primaryKeys; + public void setPrimaryColumns(String[] primaryColumns) { + this.primaryColumns = primaryColumns; } @@ -354,12 +354,12 @@ public class TableInfo { void setPrimaryKeyList(List primaryKeyList) { this.primaryKeyList = primaryKeyList; - this.primaryKeys = new String[primaryKeyList.size()]; + this.primaryColumns = new String[primaryKeyList.size()]; List insertIdFields = new ArrayList<>(); for (int i = 0; i < primaryKeyList.size(); i++) { IdInfo idInfo = primaryKeyList.get(i); - primaryKeys[i] = idInfo.getColumn(); + primaryColumns[i] = idInfo.getColumn(); if (idInfo.getKeyType() != KeyType.Auto && (idInfo.getBefore() != null && idInfo.getBefore())) { insertIdFields.add(idInfo.getColumn()); @@ -455,11 +455,11 @@ public class TableInfo { */ public String[] obtainInsertColumnsWithPk(Object entity, boolean ignoreNulls) { if (!ignoreNulls) { - return ArrayUtil.concat(primaryKeys, columns); + return ArrayUtil.concat(primaryColumns, columns); } else { MetaObject metaObject = EntityMetaObject.forObject(entity, reflectorFactory); List retColumns = new ArrayList<>(); - for (String primaryKey : primaryKeys) { + for (String primaryKey : primaryColumns) { Object value = buildColumnSqlArg(metaObject, primaryKey); if (value == null) { throw new IllegalArgumentException("Entity Primary Key value must not be null."); @@ -528,7 +528,7 @@ public class TableInfo { continue; } - if (!includePrimary && ArrayUtil.contains(primaryKeys, column)) { + if (!includePrimary && ArrayUtil.contains(primaryColumns, column)) { continue; } @@ -603,7 +603,7 @@ public class TableInfo { continue; } - if (!includePrimary && ArrayUtil.contains(primaryKeys, column)) { + if (!includePrimary && ArrayUtil.contains(primaryColumns, column)) { continue; } @@ -667,9 +667,9 @@ public class TableInfo { */ public Object[] buildPkSqlArgs(Object entity) { MetaObject metaObject = EntityMetaObject.forObject(entity, reflectorFactory); - Object[] values = new Object[primaryKeys.length]; - for (int i = 0; i < primaryKeys.length; i++) { - values[i] = buildColumnSqlArg(metaObject, primaryKeys[i]); + Object[] values = new Object[primaryColumns.length]; + for (int i = 0; i < primaryColumns.length; i++) { + values[i] = buildColumnSqlArg(metaObject, primaryColumns[i]); } return values; } diff --git a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/relation/onetoone/Account.java b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/relation/onetoone/Account.java index 469cbe5e..35605974 100644 --- a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/relation/onetoone/Account.java +++ b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/relation/onetoone/Account.java @@ -31,17 +31,24 @@ public class Account implements Serializable { private int age; -// @RelationOneToOne(selfField = "id", targetField = "accountId") + // @RelationOneToOne(selfField = "id", targetField = "accountId") +// @RelationOneToOne(targetField = "accountId") private IDCard idCard; - @RelationOneToMany(selfField = "id", targetField = "accountId") + // @RelationOneToMany(selfField = "id", targetField = "accountId") +// @RelationOneToMany(targetField = "accountId") private List books; -// @RelationManyToMany( + // @RelationManyToMany( // joinTable = "tb_role_mapping", // selfField = "id", joinSelfColumn = "account_id", // targetField = "id", joinTargetColumn = "role_id" // ) + @RelationManyToMany( + joinTable = "tb_role_mapping", + joinSelfColumn = "account_id", + joinTargetColumn = "role_id" + ) private List roles;