Skip to content

Commit

Permalink
feat: NavigateFlat支持自动推断relation type
Browse files Browse the repository at this point in the history
  • Loading branch information
xuejmnet committed Jun 9, 2024
1 parent ea80342 commit 1cda360
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,11 @@
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE})
public @interface NavigateFlat {
RelationMappingTypeEnum value();
/**
* 无需再指定value值会自动推断如果无法推断在指定即可
* @return
*/
RelationMappingTypeEnum value() default RelationMappingTypeEnum.UNKNOWN;
// /**
// * 一对多比如SchoolClass映射多个schoolTeachers
// * 那么当{@code basicMappingPropPath} 为 [schoolTeachers]且是基本类型那么会将schoolTeachers的主键进行赋值如果需要其他属性
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,6 @@
*/
public enum RelationMappingTypeEnum {
ToOne,
ToMany
ToMany,
UNKNOWN
}
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,7 @@ public void init(ServiceProvider serviceProvider) {
}
NavigateJoin navigateJoin = field.getAnnotation(NavigateJoin.class);
if (navigateJoin != null) {
createNavigateJoinMappingMetadata(navigateJoin,staticFields, property);
createNavigateJoinMappingMetadata(navigateJoin, staticFields, property);
}
}

Expand Down Expand Up @@ -336,6 +336,7 @@ private String[] getJoinMappingPath(NavigateJoin navigateJoin, Map<String, Field
}
return navigateJoin.mappingPath();
}

private String[] getMappingPath(String mapping, Map<String, Field> staticFields, String[] def) {
if (EasyStringUtil.isNotBlank(mapping)) {
Field field = staticFields.get(mapping);
Expand All @@ -359,6 +360,14 @@ private void createNavigateFlatMappingMetadata(NavigateFlat navigateFlat, Map<St
throw new EasyQueryInvalidOperationException("navigate flat, mappingPath at least two path");
}
RelationMappingTypeEnum relationMappingType = navigateFlat.value();
if (relationMappingType == RelationMappingTypeEnum.UNKNOWN) {
Class<?> propertyType = fastBeanProperty.getPropertyType();
if (Collection.class.isAssignableFrom(propertyType)) {
relationMappingType = RelationMappingTypeEnum.ToMany;
} else {
relationMappingType = RelationMappingTypeEnum.ToOne;
}
}
boolean toMany = relationMappingType.equals(RelationMappingTypeEnum.ToMany);
Class<?> navigateType = getNavigateType(toMany, field, fastBeanProperty);
if (navigateType == null) {
Expand All @@ -372,7 +381,7 @@ private void createNavigateFlatMappingMetadata(NavigateFlat navigateFlat, Map<St
property2NavigateFlatMap.put(property, navigateFlatMetadata);
}

private void createNavigateJoinMappingMetadata(NavigateJoin navigateJoin,Map<String, Field> staticFields, String property) {
private void createNavigateJoinMappingMetadata(NavigateJoin navigateJoin, Map<String, Field> staticFields, String property) {
String[] mappingPath = getJoinMappingPath(navigateJoin, staticFields);
if (mappingPath.length <= 1) {
throw new EasyQueryInvalidOperationException("navigate join, mappingPath at least two path");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.easy.query.test.entity.school.SchoolClass;
import com.easy.query.test.entity.school.proxy.SchoolClassProxy;
import lombok.Data;
import lombok.experimental.FieldNameConstants;

import java.util.List;

Expand All @@ -16,6 +17,7 @@
* @author xuejiaming
*/
@Data
@FieldNameConstants(onlyExplicitlyIncluded = true)
public class SchoolClassAOProp11 {

// @Column(primaryKey = true)//主键
Expand All @@ -30,9 +32,10 @@ public class SchoolClassAOProp11 {
// @NavigateFlat(value = RelationMappingTypeEnum.ToMany, mapping = "schoolStudentsIdsFlat")
// @NavigateFlat(value = RelationMappingTypeEnum.ToMany,mapping = "schoolStudentsIdsPath")

@FieldNameConstants.Include
private static final MappingPath SCHOOL_STUDENT_ID_PATH= SchoolClassProxy.TABLE.schoolStudents().flatElement().id();

@NavigateFlat(value = RelationMappingTypeEnum.ToMany, pathAlias = "SCHOOL_STUDENT_ID_PATH")
@NavigateFlat(value = RelationMappingTypeEnum.ToMany, pathAlias = Fields.SCHOOL_STUDENT_ID_PATH)
private List<String> schoolStudentsIds;
@NavigateFlat(value = RelationMappingTypeEnum.ToMany,mappingPath = {"schoolTeachers","schoolClasses","id"})
private List<String> schoolTeachersClassIds;
Expand Down

0 comments on commit 1cda360

Please sign in to comment.