完善代码生成

This commit is contained in:
2024-03-18 10:52:01 +08:00
parent 1439fb30cd
commit 5ce851337a
3 changed files with 143 additions and 10 deletions

View File

@@ -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(

View File

@@ -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<String, String> 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.");
}
});
}
}

View File

@@ -91,7 +91,7 @@ class DepartmentService extends BaseService<DepartmentEntity, DepartmentReposito
Sort.by(request.getOrders())));
List<String> selfAndParentIds =
this.dbFunctionService.selfAndParentIds("t_department",
this.dbFunctionService.selfAndParentIds(dbFunctionService.entityToTableName(DepartmentEntity.class),
page.stream().map(x -> x.getId()).collect(Collectors.toList()), true);
List<DepartmentTreeDto> selfAndParent = this.findAllByIds(selfAndParentIds).stream().map(x -> (this.mapper.toTreeDtoExcludeChildren(x))).collect(Collectors.toList());