From 5ce851337a12355edcab1c47e90cb1e1ea7ef395 Mon Sep 17 00:00:00 2001 From: lihongjie0209 Date: Mon, 18 Mar 2024 10:52:01 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E4=BB=A3=E7=A0=81=E7=94=9F?= =?UTF-8?q?=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/cn/lihongjie/coal/Codegen.java | 107 ++++++++++++++++-- .../coal/dbFunctions/DbFunctionService.java | 44 +++++++ .../department/service/DepartmentService.java | 2 +- 3 files changed, 143 insertions(+), 10 deletions(-) diff --git a/src/main/java/cn/lihongjie/coal/Codegen.java b/src/main/java/cn/lihongjie/coal/Codegen.java index 844b4177..21a26cfc 100644 --- a/src/main/java/cn/lihongjie/coal/Codegen.java +++ b/src/main/java/cn/lihongjie/coal/Codegen.java @@ -14,6 +14,8 @@ import cn.lihongjie.coal.base.mapper.CommonEntityMapper; import cn.lihongjie.coal.base.mapper.CommonMapper; import cn.lihongjie.coal.base.service.BaseService; import cn.lihongjie.coal.common.ArchiveUtils; +import cn.lihongjie.coal.common.TreeUtils; +import cn.lihongjie.coal.dbFunctions.DbFunctionService; import cn.lihongjie.coal.exception.BizException; import com.google.common.base.CaseFormat; @@ -29,6 +31,7 @@ import lombok.Data; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.mapstruct.Mapper; import org.mapstruct.Mapping; @@ -59,6 +62,8 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.Scanner; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; import javax.lang.model.element.Modifier; @@ -363,7 +368,7 @@ public class Codegen { .build()) .addMethod( - MethodSpec.methodBuilder("toTreeExcludeChildren") + MethodSpec.methodBuilder("toTreeDtoExcludeChildren") .addModifiers(Modifier.PUBLIC, Modifier.ABSTRACT) .addAnnotation( AnnotationSpec.builder(Mappings.class) @@ -498,6 +503,13 @@ public class Codegen { Modifier.PRIVATE) .addAnnotation(Autowired.class) .build()) + .addField( + FieldSpec.builder( + ClassName.get(DbFunctionService.class), + "dbFunctionService", + Modifier.PRIVATE) + .addAnnotation(Autowired.class) + .build()) .addMethod( MethodSpec.methodBuilder("create") .addModifiers(Modifier.PUBLIC) @@ -601,22 +613,94 @@ public class Codegen { .addMethod( MethodSpec.methodBuilder("getRoots") .addModifiers(Modifier.PUBLIC) + .addParameter(ClassName.get(CommonQuery.class), "request") .returns( ParameterizedTypeName.get( ClassName.get(List.class), ClassName.get( dtoPackage, treeDto.name))) - .addStatement( - """ + .addCode(CodeBlock.builder() + .add(""" + + if ($T.isEmpty(request.getItems())){ + $T roots = this.repository.findAll( (root, query, criteriaBuilder) -> criteriaBuilder.isNull(root.get("parent"))); + return roots.stream().map(de -> this.mapper.toTreeDto(de)).collect($T.toList()); + }else { + $T page = + repository.findAll( + request.specification(conversionService), + $T.of( + request.getPageNo(), + request.getPageSize(), + $T.by(request.getOrders()))); + + $T selfAndParentIds = + this.dbFunctionService.selfAndParentIds(dbFunctionService.entityToTableName($T.class), + page.stream().map(x -> x.getId()).collect($T.toList()), true); + + $T selfAndParent = this.findAllByIds(selfAndParentIds).stream().map(x -> (this.mapper.toTreeDtoExcludeChildren(x))).collect($T.toList()); + + + return $T.stream( + $T.buildTreeFromList( + selfAndParent, + $T::getId, + x -> x.getParent(), + (x, y) -> { + if (x.getChildren() == null) { + x.setChildren(new $T<>()); + } + x.getChildren().add(y); + return null; + }) + .spliterator(), + false) + .collect($T.toList()); + } - var roots = this.repository.findAll((root, query, criteriaBuilder) -> criteriaBuilder.isNull(root.get("parent"))); - return roots.stream().map(de -> this.mapper.toTreeDto(de)).collect($T.toList()) """, - ClassName.get( - java.util.stream.Collectors.class)) + ClassName.get( + CollectionUtils.class), + ParameterizedTypeName.get( + ClassName.get(List.class), + ClassName.get( + entityPackage, entity.name)), + ClassName.get( + Collectors.class), + ParameterizedTypeName.get( + ClassName.get(Page.class), + ClassName.get( + entityPackage, entity.name)), + ClassName.get(PageRequest.class), + ClassName.get(Sort.class), + + ParameterizedTypeName.get( + ClassName.get(List.class), + ClassName.get(String.class)), + ClassName.get( + entityPackage, entity.name), + ClassName.get( + Collectors.class), + ParameterizedTypeName.get( + ClassName.get(List.class), + ClassName.get( + dtoPackage, treeDto.name)), + ClassName.get( + Collectors.class), + ClassName.get(StreamSupport.class), + ClassName.get(TreeUtils.class), + ClassName.get(dtoPackage, treeDto.name), + ClassName.get(ArrayList.class), + ClassName.get(Collectors.class)) + .build() + + + ) + + .build()) .addMethod( MethodSpec.methodBuilder("getTreeByIds") @@ -637,7 +721,7 @@ public class Codegen { """, ClassName.get(ArrayList.class), ClassName.get( - java.util.stream.Collectors.class)) + Collectors.class)) .build()) .build(); } @@ -823,6 +907,11 @@ public class Codegen { .addMethod( MethodSpec.methodBuilder("roots") .addModifiers(Modifier.PUBLIC) + .addParameter( + ParameterSpec.builder( + ClassName.get(CommonQuery.class), "request") + .addAnnotation(RequestBody.class) + .build()) .returns( ParameterizedTypeName.get( ClassName.get(List.class), @@ -833,7 +922,7 @@ public class Codegen { .build()) .addStatement( """ - return this.service.getRoots() + return this.service.getRoots(request) """) .build()) .addMethod( diff --git a/src/main/java/cn/lihongjie/coal/dbFunctions/DbFunctionService.java b/src/main/java/cn/lihongjie/coal/dbFunctions/DbFunctionService.java index e6eabb06..e40abd60 100644 --- a/src/main/java/cn/lihongjie/coal/dbFunctions/DbFunctionService.java +++ b/src/main/java/cn/lihongjie/coal/dbFunctions/DbFunctionService.java @@ -1,11 +1,20 @@ package cn.lihongjie.coal.dbFunctions; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; + import io.hypersistence.utils.hibernate.type.array.StringArrayType; +import jakarta.annotation.PostConstruct; import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; import jakarta.persistence.Query; +import lombok.SneakyThrows; + +import org.hibernate.internal.SessionImpl; +import org.hibernate.persister.entity.AbstractEntityPersister; +import org.hibernate.persister.entity.EntityPersister; import org.hibernate.query.TypedParameterValue; import org.springframework.stereotype.Service; @@ -67,4 +76,39 @@ public class DbFunctionService { } return Arrays.stream(((String[]) resultList.get(0))).toList(); } + + private Cache tableNameCache; + + @PostConstruct + public void init(){ + tableNameCache = CacheBuilder.newBuilder().maximumSize(1000).build(); + } + + @SneakyThrows + public String entityToTableName(Class entityClass){ + + return tableNameCache.get(entityClass.getCanonicalName(), () -> { + + Object entityExample; + try { + entityExample = entityClass.newInstance(); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + + SessionImpl session = entityManager.unwrap(SessionImpl.class); + + EntityPersister persister = session.getEntityPersister(null, entityExample); + + if (persister instanceof AbstractEntityPersister persisterImpl) { + + + return persisterImpl.getRootTableName(); + + } else { + throw new RuntimeException("Unexpected persister type; a subtype of AbstractEntityPersister expected."); + } + + }); + } } diff --git a/src/main/java/cn/lihongjie/coal/department/service/DepartmentService.java b/src/main/java/cn/lihongjie/coal/department/service/DepartmentService.java index 98e18018..b5080c55 100644 --- a/src/main/java/cn/lihongjie/coal/department/service/DepartmentService.java +++ b/src/main/java/cn/lihongjie/coal/department/service/DepartmentService.java @@ -91,7 +91,7 @@ class DepartmentService extends BaseService selfAndParentIds = - this.dbFunctionService.selfAndParentIds("t_department", + this.dbFunctionService.selfAndParentIds(dbFunctionService.entityToTableName(DepartmentEntity.class), page.stream().map(x -> x.getId()).collect(Collectors.toList()), true); List selfAndParent = this.findAllByIds(selfAndParentIds).stream().map(x -> (this.mapper.toTreeDtoExcludeChildren(x))).collect(Collectors.toList());