diff --git a/core/pom.xml b/core/pom.xml index 28be229..852647c 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -5,7 +5,7 @@ com.cosium.spring.data spring-data-jpa-entity-graph-parent - 3.2.3-SNAPSHOT + 3.3-SNAPSHOT Spring Data JPA EntityGraph diff --git a/core/src/test/java/com/cosium/spring/data/jpa/entity/graph/repository/GeneratedEntityGraphTest.java b/core/src/test/java/com/cosium/spring/data/jpa/entity/graph/repository/GeneratedEntityGraphTest.java index a3673d8..3f77576 100644 --- a/core/src/test/java/com/cosium/spring/data/jpa/entity/graph/repository/GeneratedEntityGraphTest.java +++ b/core/src/test/java/com/cosium/spring/data/jpa/entity/graph/repository/GeneratedEntityGraphTest.java @@ -44,6 +44,24 @@ void test() { assertThat(Hibernate.isInitialized(product.getMaker().getCountry())).isTrue(); } + @Transactional + @Test + void test_() { + Product product = + productRepository + .findById( + 1L, + ProductEntityGraph.inic_( + productEG -> + productEG.brand_().category_().maker_(makerEG -> makerEG.country_()))) + .orElseThrow(RuntimeException::new); + + assertThat(Hibernate.isInitialized(product.getBrand())).isTrue(); + assertThat(Hibernate.isInitialized(product.getCategory())).isTrue(); + assertThat(Hibernate.isInitialized(product.getMaker())).isTrue(); + assertThat(Hibernate.isInitialized(product.getMaker().getCountry())).isTrue(); + } + @Test @DisplayName("EntityGraph with embedded part is well generated") void test2() { diff --git a/generator/pom.xml b/generator/pom.xml index 7560f73..874f2f7 100644 --- a/generator/pom.xml +++ b/generator/pom.xml @@ -5,7 +5,7 @@ com.cosium.spring.data spring-data-jpa-entity-graph-parent - 3.2.3-SNAPSHOT + 3.3-SNAPSHOT Spring Data JPA EntityGraph Generator diff --git a/generator/src/main/java/com/cosium/spring/data/jpa/graph/generator/EntityGraph.java b/generator/src/main/java/com/cosium/spring/data/jpa/graph/generator/EntityGraph.java index 9af6294..5997fea 100644 --- a/generator/src/main/java/com/cosium/spring/data/jpa/graph/generator/EntityGraph.java +++ b/generator/src/main/java/com/cosium/spring/data/jpa/graph/generator/EntityGraph.java @@ -10,6 +10,7 @@ import java.io.IOException; import java.util.Objects; import java.util.Optional; +import java.util.function.Function; import java.util.stream.Collectors; import javax.annotation.processing.Filer; import javax.lang.model.element.Modifier; @@ -64,6 +65,20 @@ public EntityGraph( .addStatement("return new $N()", rootComposer.simpleName()) .build(); + MethodSpec inicMethod = + MethodSpec.methodBuilder("inic_") + .addModifiers(Modifier.PUBLIC, Modifier.STATIC) + .returns(Constants.ENTITY_GRAPH_CLASS_NAME) + .addParameter( + ParameterizedTypeName.get( + ClassName.get(Function.class), rootComposerClassName, rootComposerClassName), + "initializer") + .addStatement( + "return initializer.apply($N()).$N()", + Constants.PATH_SEPARATOR, + Constants.PATH_SEPARATOR) + .build(); + MethodSpec rootStaticMethodWithEntityGraphType = MethodSpec.methodBuilder(Constants.PATH_SEPARATOR) .addModifiers(Modifier.PUBLIC, Modifier.STATIC) @@ -96,6 +111,7 @@ public EntityGraph( .addMethod(emptyConstructor) .addMethod(constructor) .addMethod(rootStaticMethod) + .addMethod(inicMethod) .addMethod(rootStaticMethodWithEntityGraphType) .addMethod(getEntityGraphTypeMethod) .addType(rootComposer.toTypeSpec()) diff --git a/generator/src/main/java/com/cosium/spring/data/jpa/graph/generator/NodeComposer.java b/generator/src/main/java/com/cosium/spring/data/jpa/graph/generator/NodeComposer.java index c7a7b5c..3216986 100644 --- a/generator/src/main/java/com/cosium/spring/data/jpa/graph/generator/NodeComposer.java +++ b/generator/src/main/java/com/cosium/spring/data/jpa/graph/generator/NodeComposer.java @@ -7,6 +7,7 @@ import com.squareup.javapoet.TypeSpec; import com.squareup.javapoet.TypeVariableName; import java.util.List; +import java.util.function.Function; import javax.lang.model.element.Modifier; import javax.lang.model.util.Elements; @@ -88,6 +89,24 @@ private void addPathToEntity(Elements elements, MetamodelAttributeTarget target) .addStatement("path.add($S)", target.attributeName()) .addStatement("return new $T($N, path)", targetNodeComposer, Constants.PATH_SEPARATOR) .build()); + + typeSpecBuilder.addMethod( + MethodSpec.methodBuilder(target.attributeName() + "_") + .addModifiers(Modifier.PUBLIC) + .returns(rootType) + .addStatement("return this.$N().$N", target.attributeName(), Constants.PATH_SEPARATOR) + .build()); + + typeSpecBuilder.addMethod( + MethodSpec.methodBuilder(target.attributeName() + "_") + .addModifiers(Modifier.PUBLIC) + .returns(rootType) + .addParameter( + ParameterizedTypeName.get( + ClassName.get(Function.class), targetNodeComposer, rootType), + "initializer") + .addStatement("return initializer.apply(this.$N())", target.attributeName()) + .build()); } private void addPathToLeafComposer(MetamodelAttributeTarget target) { diff --git a/generator/src/main/java/com/cosium/spring/data/jpa/graph/generator/RootComposer.java b/generator/src/main/java/com/cosium/spring/data/jpa/graph/generator/RootComposer.java index b57e7be..1cf95e3 100644 --- a/generator/src/main/java/com/cosium/spring/data/jpa/graph/generator/RootComposer.java +++ b/generator/src/main/java/com/cosium/spring/data/jpa/graph/generator/RootComposer.java @@ -7,6 +7,7 @@ import com.squareup.javapoet.TypeSpec; import java.util.ArrayList; import java.util.List; +import java.util.function.Function; import javax.lang.model.element.Modifier; import javax.lang.model.util.Elements; @@ -113,6 +114,26 @@ private void addPathToEntity(Elements elements, MetamodelAttributeTarget target) .addStatement("entityGraphAttributePaths.add(path)") .addStatement("return new $T(this, path)", targetNodeComposer) .build()); + + typeSpecBuilder.addMethod( + MethodSpec.methodBuilder(target.attributeName() + "_") + .addModifiers(Modifier.PUBLIC) + .returns(entityGraphClassName.nestedClass(SIMPLE_NAME)) + .addStatement("return this.$N().$N", target.attributeName(), Constants.PATH_SEPARATOR) + .build()); + + typeSpecBuilder.addMethod( + MethodSpec.methodBuilder(target.attributeName() + "_") + .addModifiers(Modifier.PUBLIC) + .returns(entityGraphClassName.nestedClass(SIMPLE_NAME)) + .addParameter( + ParameterizedTypeName.get( + ClassName.get(Function.class), + targetNodeComposer, + entityGraphClassName.nestedClass(SIMPLE_NAME)), + "initializer") + .addStatement("return initializer.apply(this.$N())", target.attributeName()) + .build()); } private void addPathToLeafComposer(MetamodelAttributeTarget target) { diff --git a/pom.xml b/pom.xml index cd715d8..6378d2c 100644 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ com.cosium.spring.data spring-data-jpa-entity-graph-parent - 3.2.3-SNAPSHOT + 3.3-SNAPSHOT pom