diff --git a/pom.xml b/pom.xml index 369aec178b5f3fb0918d4801444080ea49e08a87..14666cfdbb329892745f82319e9e3fb35efc3647 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.gitee.digital-engine spring-domain - 2.7.6 + 2.7.7 pom diff --git a/spring-boot-starter-domain/pom.xml b/spring-boot-starter-domain/pom.xml index 8d8ec3356ee62f469213a8ca7a7ff08f59eaee56..623db1c96bea65da596c7eeccfc3adbdc8dc8a32 100644 --- a/spring-boot-starter-domain/pom.xml +++ b/spring-boot-starter-domain/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine spring-domain - 2.7.6 + 2.7.7 spring-boot-starter-domain diff --git a/spring-boot-starter-domain/src/main/java/com/gitee/spring/boot/starter/domain/builder/IsNotNullExampleBuilder.java b/spring-boot-starter-domain/src/main/java/com/gitee/spring/boot/starter/domain/builder/IsNotNullExampleBuilder.java new file mode 100644 index 0000000000000000000000000000000000000000..445372dc332a1ec3981ad92df58f03109faabf33 --- /dev/null +++ b/spring-boot-starter-domain/src/main/java/com/gitee/spring/boot/starter/domain/builder/IsNotNullExampleBuilder.java @@ -0,0 +1,14 @@ +package com.gitee.spring.boot.starter.domain.builder; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.gitee.spring.boot.starter.domain.api.ExampleBuilder; + +public class IsNotNullExampleBuilder implements ExampleBuilder { + + @Override + public void appendCriterion(Object example, String fieldName, Object fieldValue) { + QueryWrapper queryWrapper = (QueryWrapper) example; + queryWrapper.isNotNull(fieldName); + } + +} diff --git a/spring-boot-starter-domain/src/main/java/com/gitee/spring/boot/starter/domain/builder/IsNullExampleBuilder.java b/spring-boot-starter-domain/src/main/java/com/gitee/spring/boot/starter/domain/builder/IsNullExampleBuilder.java new file mode 100644 index 0000000000000000000000000000000000000000..449e109888e6e7a5337cf87b70f7f929e685aa7d --- /dev/null +++ b/spring-boot-starter-domain/src/main/java/com/gitee/spring/boot/starter/domain/builder/IsNullExampleBuilder.java @@ -0,0 +1,14 @@ +package com.gitee.spring.boot.starter.domain.builder; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.gitee.spring.boot.starter.domain.api.ExampleBuilder; + +public class IsNullExampleBuilder implements ExampleBuilder { + + @Override + public void appendCriterion(Object example, String fieldName, Object fieldValue) { + QueryWrapper queryWrapper = (QueryWrapper) example; + queryWrapper.isNull(fieldName); + } + +} diff --git a/spring-boot-starter-domain/src/main/java/com/gitee/spring/boot/starter/domain/repository/MybatisPlusEntityMapper.java b/spring-boot-starter-domain/src/main/java/com/gitee/spring/boot/starter/domain/repository/MybatisPlusEntityMapper.java index 402e0d090929eabad192eac73b1a38143de4c365..eba7526ae5eed546b3b0cb8e3c6d73ba546bbdc4 100644 --- a/spring-boot-starter-domain/src/main/java/com/gitee/spring/boot/starter/domain/repository/MybatisPlusEntityMapper.java +++ b/spring-boot-starter-domain/src/main/java/com/gitee/spring/boot/starter/domain/repository/MybatisPlusEntityMapper.java @@ -27,12 +27,14 @@ public class MybatisPlusEntityMapper implements EntityMapper { operatorExampleBuilderMap.put(Operator.NE, new NEExampleBuilder()); operatorExampleBuilderMap.put(Operator.IN, new InExampleBuilder()); operatorExampleBuilderMap.put(Operator.NOT_IN, new NotInExampleBuilder()); + operatorExampleBuilderMap.put(Operator.IS_NULL, new IsNullExampleBuilder()); + operatorExampleBuilderMap.put(Operator.IS_NOT_NULL, new IsNotNullExampleBuilder()); + operatorExampleBuilderMap.put(Operator.LIKE, new LikeExampleBuilder()); + operatorExampleBuilderMap.put(Operator.NOT_LIKE, new NotLikeExampleBuilder()); operatorExampleBuilderMap.put(Operator.GT, new GTExampleBuilder()); operatorExampleBuilderMap.put(Operator.GE, new GEExampleBuilder()); operatorExampleBuilderMap.put(Operator.LT, new LTExampleBuilder()); operatorExampleBuilderMap.put(Operator.LE, new LEExampleBuilder()); - operatorExampleBuilderMap.put(Operator.LIKE, new LikeExampleBuilder()); - operatorExampleBuilderMap.put(Operator.NOT_LIKE, new NotLikeExampleBuilder()); } @Override diff --git a/spring-domain-coating/pom.xml b/spring-domain-coating/pom.xml index 75ccc56f75e78a146cdc9d68d367d4bad23f8783..97c8872ccacc1beb556bd5d456434de729d30161 100644 --- a/spring-domain-coating/pom.xml +++ b/spring-domain-coating/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine spring-domain - 2.7.6 + 2.7.7 spring-domain-coating diff --git a/spring-domain-core/pom.xml b/spring-domain-core/pom.xml index b8784f14cea042c2b87c3e2935f7bf5570b99236..d4ea4fa6a8fd841dc8ae56e8d538b4ec2264062d 100644 --- a/spring-domain-core/pom.xml +++ b/spring-domain-core/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine spring-domain - 2.7.6 + 2.7.7 spring-domain-core diff --git a/spring-domain-core/src/main/java/com/gitee/spring/domain/core/api/EntityIndex.java b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/api/EntityIndex.java index f7c2299f8fc68b360e74ddc1c2d345b8f5419c1e..8cb497704a13da1b7f4bc4b5d81a1964e2550bec 100644 --- a/spring-domain-core/src/main/java/com/gitee/spring/domain/core/api/EntityIndex.java +++ b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/api/EntityIndex.java @@ -1,11 +1,11 @@ package com.gitee.spring.domain.core.api; -import com.gitee.spring.domain.core.repository.ConfiguredRepository; +import com.gitee.spring.domain.core.entity.ForeignKey; import java.util.List; public interface EntityIndex { - List selectList(Object rootEntity, ConfiguredRepository configuredRepository); + List selectList(Object rootEntity, ForeignKey foreignKey); } diff --git a/spring-domain-core/src/main/java/com/gitee/spring/domain/core/constants/Operator.java b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/constants/Operator.java index b4f4061a94934d0e0d5a5fc24f052f148afe7dd3..76cee7716c1be3dc998a0998a920cbf0d470bd4f 100644 --- a/spring-domain-core/src/main/java/com/gitee/spring/domain/core/constants/Operator.java +++ b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/constants/Operator.java @@ -5,10 +5,12 @@ public interface Operator { String NE = "!="; String IN = "in"; String NOT_IN = "not in"; + String IS_NULL = "is null"; + String IS_NOT_NULL = "is not null"; + String LIKE = "like"; + String NOT_LIKE = "not like"; String GT = ">"; String GE = ">="; String LT = "<"; String LE = "<="; - String LIKE = "like"; - String NOT_LIKE = "not like"; } diff --git a/spring-domain-core/src/main/java/com/gitee/spring/domain/core/entity/EntityExample.java b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/entity/EntityExample.java index 95674e105e86056f7a14e359def275d3078670c2..fc5e7addc6f62e65d9a0440824e3e04723f35a1e 100644 --- a/spring-domain-core/src/main/java/com/gitee/spring/domain/core/entity/EntityExample.java +++ b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/entity/EntityExample.java @@ -51,6 +51,26 @@ public class EntityExample { return this; } + public EntityExample isNull(String fieldName) { + entityCriteria.add(new EntityCriterion(fieldName, Operator.IS_NULL, null)); + return this; + } + + public EntityExample isNotNull(String fieldName) { + entityCriteria.add(new EntityCriterion(fieldName, Operator.IS_NOT_NULL, null)); + return this; + } + + public EntityExample like(String fieldName, Object fieldValue) { + entityCriteria.add(new EntityCriterion(fieldName, Operator.LIKE, fieldValue)); + return this; + } + + public EntityExample notLike(String fieldName, Object fieldValue) { + entityCriteria.add(new EntityCriterion(fieldName, Operator.NOT_LIKE, fieldValue)); + return this; + } + public EntityExample gt(String fieldName, Object fieldValue) { entityCriteria.add(new EntityCriterion(fieldName, Operator.GT, fieldValue)); return this; @@ -71,16 +91,6 @@ public class EntityExample { return this; } - public EntityExample like(String fieldName, Object fieldValue) { - entityCriteria.add(new EntityCriterion(fieldName, Operator.LIKE, fieldValue)); - return this; - } - - public EntityExample notLike(String fieldName, Object fieldValue) { - entityCriteria.add(new EntityCriterion(fieldName, Operator.NOT_LIKE, fieldValue)); - return this; - } - public void orderByAsc(String... columns) { orderBy = StringUtils.toUnderlineCase(columns); sort = "asc"; diff --git a/spring-domain-core/src/main/java/com/gitee/spring/domain/core/entity/ForeignKey.java b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/entity/ForeignKey.java new file mode 100644 index 0000000000000000000000000000000000000000..3d23f96456b1a9e2b77c58f8208a4b3888150569 --- /dev/null +++ b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/entity/ForeignKey.java @@ -0,0 +1,56 @@ +package com.gitee.spring.domain.core.entity; + +import com.gitee.spring.domain.core.repository.ConfiguredRepository; +import lombok.Data; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +@Data +public class ForeignKey { + + protected ConfiguredRepository configuredRepository; + protected Object rootEntity; + protected List keys; + + public ForeignKey(ConfiguredRepository configuredRepository, Object rootEntity) { + this.configuredRepository = configuredRepository; + this.rootEntity = rootEntity; + } + + public void mergeFieldValue(String fieldName, Object fieldValue) { + if (fieldValue instanceof Collection) { + Collection fieldValues = (Collection) fieldValue; + if (keys == null) { + keys = new ArrayList<>(fieldValues.size()); + } + if (keys.isEmpty()) { + for (Object eachFieldValue : fieldValues) { + keys.add(fieldName + ": " + eachFieldValue); + } + } else { + List newKeys = new ArrayList<>(keys.size() * fieldValues.size()); + for (String existKey : keys) { + for (Object eachFieldValue : fieldValues) { + newKeys.add(existKey + ", " + fieldName + ": " + eachFieldValue); + } + } + keys = newKeys; + } + } else { + if (keys == null) { + keys = new ArrayList<>(1); + } + if (keys.isEmpty()) { + keys.add(fieldName + ": " + fieldValue); + } else { + for (int index = 0; index < keys.size(); index++) { + String existKey = keys.get(index); + keys.set(index, existKey + ", " + fieldName + ": " + fieldValue); + } + } + } + } + +} diff --git a/spring-domain-core/src/main/java/com/gitee/spring/domain/core/impl/DefaultEntityIndex.java b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/impl/DefaultEntityIndex.java index cb6bdc1dc129f9273b271e34f3ec9764a087792a..30da78c235cdb6ad733506ef9d51297d38922674 100644 --- a/spring-domain-core/src/main/java/com/gitee/spring/domain/core/impl/DefaultEntityIndex.java +++ b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/impl/DefaultEntityIndex.java @@ -4,6 +4,7 @@ import com.gitee.spring.domain.core.api.EntityIndex; import com.gitee.spring.domain.core.entity.BindingDefinition; import com.gitee.spring.domain.core.entity.EntityDefinition; import com.gitee.spring.domain.core.entity.EntityPropertyChain; +import com.gitee.spring.domain.core.entity.ForeignKey; import com.gitee.spring.domain.core.repository.ConfiguredRepository; import java.util.ArrayList; @@ -51,32 +52,37 @@ public class DefaultEntityIndex implements EntityIndex { @Override @SuppressWarnings("unchecked") - public List selectList(Object rootEntity, ConfiguredRepository configuredRepository) { - String foreignKey = buildForeignKey(rootEntity, configuredRepository); - Object existEntity = entitiesMap.get(foreignKey); - if (existEntity != null) { - if (existEntity instanceof Collection) { - return (List) existEntity; + public List selectList(Object rootEntity, ForeignKey foreignKey) { + List keys = foreignKey.getKeys(); + if (keys.isEmpty()) { + return Collections.emptyList(); + + } else if (keys.size() == 1) { + Object existEntity = entitiesMap.get(keys.get(0)); + if (existEntity != null) { + if (existEntity instanceof Collection) { + return (List) existEntity; + } else { + return Collections.singletonList(existEntity); + } } else { - return Collections.singletonList(existEntity); + return Collections.emptyList(); } - } - return Collections.emptyList(); - } - public String buildForeignKey(Object rootEntity, ConfiguredRepository configuredRepository) { - StringBuilder builder = new StringBuilder(); - EntityDefinition entityDefinition = configuredRepository.getEntityDefinition(); - for (BindingDefinition bindingDefinition : entityDefinition.getBoundBindingDefinitions()) { - String aliasAttribute = bindingDefinition.getAliasAttribute(); - EntityPropertyChain boundEntityPropertyChain = bindingDefinition.getBoundEntityPropertyChain(); - Object boundValue = boundEntityPropertyChain.getValue(rootEntity); - builder.append(aliasAttribute).append(": ").append(boundValue).append(", "); - } - if (builder.length() > 0) { - builder.delete(builder.length() - 2, builder.length()); + } else { + List fieldValues = new ArrayList<>(); + for (String key : keys) { + Object existEntity = entitiesMap.get(key); + if (existEntity != null) { + if (existEntity instanceof Collection) { + fieldValues.addAll((Collection) existEntity); + } else { + fieldValues.add(existEntity); + } + } + } + return fieldValues; } - return builder.toString(); } } diff --git a/spring-domain-core/src/main/java/com/gitee/spring/domain/core/repository/AbstractBatchRepository.java b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/repository/AbstractBatchRepository.java index 29bdf15b948528314b479a3c128495ee5dbbed5a..13becd237399b26d8ffe27d344c678f63143618e 100644 --- a/spring-domain-core/src/main/java/com/gitee/spring/domain/core/repository/AbstractBatchRepository.java +++ b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/repository/AbstractBatchRepository.java @@ -3,11 +3,7 @@ package com.gitee.spring.domain.core.repository; import com.gitee.spring.domain.core.api.EntityIndex; import com.gitee.spring.domain.core.api.EntityProperty; import com.gitee.spring.domain.core.api.PropertyConverter; -import com.gitee.spring.domain.core.entity.BindingDefinition; -import com.gitee.spring.domain.core.entity.BoundedContext; -import com.gitee.spring.domain.core.entity.EntityDefinition; -import com.gitee.spring.domain.core.entity.EntityExample; -import com.gitee.spring.domain.core.entity.EntityPropertyChain; +import com.gitee.spring.domain.core.entity.*; import com.gitee.spring.domain.core.impl.DefaultEntityIndex; import lombok.extern.slf4j.Slf4j; @@ -49,22 +45,25 @@ public abstract class AbstractBatchRepository extends AbstractGenericRepo protected void executeQuery(BoundedContext boundedContext, List rootEntities, AbstractDelegateRepository abstractDelegateRepository) { for (ConfiguredRepository configuredRepository : abstractDelegateRepository.getSubRepositories()) { if (isMatchScenes(boundedContext, configuredRepository)) { - EntityExample entityExample = newExampleByRootEntities(boundedContext, rootEntities, configuredRepository); + Map foreignKeyMap = new LinkedHashMap<>(); + EntityExample entityExample = newExampleByRootEntities(boundedContext, rootEntities, configuredRepository, foreignKeyMap); if (!entityExample.isEmptyQuery() && entityExample.isDirtyQuery()) { List entities = configuredRepository.selectByExample(boundedContext, entityExample); EntityIndex entityIndex = buildEntityIndex(configuredRepository, entities); - assembleRootEntities(rootEntities, configuredRepository, entityIndex); + assembleRootEntities(rootEntities, configuredRepository, foreignKeyMap, entityIndex); } } } } - protected EntityExample newExampleByRootEntities(BoundedContext boundedContext, List rootEntities, ConfiguredRepository configuredRepository) { + protected EntityExample newExampleByRootEntities(BoundedContext boundedContext, List rootEntities, + ConfiguredRepository configuredRepository, Map foreignKeyMap) { EntityDefinition entityDefinition = configuredRepository.getEntityDefinition(); EntityExample entityExample = new EntityExample(); for (BindingDefinition bindingDefinition : entityDefinition.getBoundBindingDefinitions()) { EntityPropertyChain boundEntityPropertyChain = bindingDefinition.getBoundEntityPropertyChain(); PropertyConverter propertyConverter = bindingDefinition.getPropertyConverter(); + String aliasAttribute = bindingDefinition.getAliasAttribute(); List fieldValues = new ArrayList<>(); for (Object rootEntity : rootEntities) { Object boundValue = boundEntityPropertyChain.getValue(rootEntity); @@ -76,9 +75,10 @@ public abstract class AbstractBatchRepository extends AbstractGenericRepo fieldValues.add(boundValue); } } + ForeignKey foreignKey = foreignKeyMap.computeIfAbsent(rootEntity, key -> buildForeignKey(configuredRepository, rootEntity)); + foreignKey.mergeFieldValue(aliasAttribute, boundValue); } if (!fieldValues.isEmpty()) { - String aliasAttribute = bindingDefinition.getAliasAttribute(); entityExample.eq(aliasAttribute, fieldValues); } else { entityExample.setEmptyQuery(true); @@ -91,17 +91,22 @@ public abstract class AbstractBatchRepository extends AbstractGenericRepo return entityExample; } + protected ForeignKey buildForeignKey(ConfiguredRepository configuredRepository, Object rootEntity) { + return new ForeignKey(configuredRepository, rootEntity); + } + protected EntityIndex buildEntityIndex(ConfiguredRepository configuredRepository, List entities) { return new DefaultEntityIndex(configuredRepository, entities); } - protected void assembleRootEntities(List rootEntities, ConfiguredRepository configuredRepository, EntityIndex entityIndex) { + protected void assembleRootEntities(List rootEntities, ConfiguredRepository configuredRepository, + Map foreignKeyMap, EntityIndex entityIndex) { for (Object rootEntity : rootEntities) { EntityPropertyChain entityPropertyChain = configuredRepository.getEntityPropertyChain(); EntityPropertyChain lastEntityPropertyChain = entityPropertyChain.getLastEntityPropertyChain(); Object lastEntity = lastEntityPropertyChain == null ? rootEntity : lastEntityPropertyChain.getValue(rootEntity); if (lastEntity != null) { - List entities = entityIndex.selectList(rootEntity, configuredRepository); + List entities = entityIndex.selectList(rootEntity, foreignKeyMap.get(rootEntity)); Object entity = convertManyToOneEntity(configuredRepository, entities); if (entity != null) { EntityProperty entityProperty = entityPropertyChain.getEntityProperty(); diff --git a/spring-domain-core/src/main/java/com/gitee/spring/domain/core/repository/AbstractGenericRepository.java b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/repository/AbstractGenericRepository.java index 91988d6e656226f25a3c569a84b681e6f98d1948..3158803a76a6a18a726b5debff80ccede0958aee 100644 --- a/spring-domain-core/src/main/java/com/gitee/spring/domain/core/repository/AbstractGenericRepository.java +++ b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/repository/AbstractGenericRepository.java @@ -93,10 +93,10 @@ public abstract class AbstractGenericRepository extends AbstractDelegateR for (BindingDefinition bindingDefinition : entityDefinition.getBoundBindingDefinitions()) { EntityPropertyChain boundEntityPropertyChain = bindingDefinition.getBoundEntityPropertyChain(); PropertyConverter propertyConverter = bindingDefinition.getPropertyConverter(); + String aliasAttribute = bindingDefinition.getAliasAttribute(); Object boundValue = boundEntityPropertyChain.getValue(rootEntity); if (boundValue != null) { boundValue = propertyConverter.convert(boundedContext, boundValue); - String aliasAttribute = bindingDefinition.getAliasAttribute(); entityExample.eq(aliasAttribute, boundValue); } else { entityExample.setEmptyQuery(true); diff --git a/spring-domain-event/pom.xml b/spring-domain-event/pom.xml index be200e2fffbcc2bad5ae8ad1b0fd8ac772a7785e..f5f0e5f062d63f5ba071f8139557cbf23139d77a 100644 --- a/spring-domain-event/pom.xml +++ b/spring-domain-event/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine spring-domain - 2.7.6 + 2.7.7 spring-domain-event diff --git a/spring-domain-injection/pom.xml b/spring-domain-injection/pom.xml index 2c4596871a279e53fadc3f209350c6d2d334822f..294ab2f6e771f8305b1958282a9c4e4a7ede0cbd 100644 --- a/spring-domain-injection/pom.xml +++ b/spring-domain-injection/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine spring-domain - 2.7.6 + 2.7.7 spring-domain-injection diff --git a/spring-domain-web/pom.xml b/spring-domain-web/pom.xml index b3f0f151073977fb3448e77f8497f74ac48fc247..067aded8f6e84ab7c78f933c07242acc96bb2e9c 100644 --- a/spring-domain-web/pom.xml +++ b/spring-domain-web/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine spring-domain - 2.7.6 + 2.7.7 spring-domain-web