From 55912ced53a2cd834e37a8c5a13504a8f138b702 Mon Sep 17 00:00:00 2001 From: Gavin King Date: Thu, 26 Jun 2025 20:48:27 +0200 Subject: [PATCH 1/2] fix @Delete queries for reactive repos --- .../test/data/reactive/ReactiveTest.java | 2 +- .../test/data/reactive/RepoWithPrimary.java | 22 +++++++++++ .../annotation/AbstractCriteriaMethod.java | 6 +-- .../annotation/AnnotationMetaEntity.java | 38 +++++++++++++++---- .../annotation/CriteriaDeleteMethod.java | 13 +++++-- 5 files changed, 64 insertions(+), 17 deletions(-) create mode 100644 tooling/metamodel-generator/src/jakartaData/java/org/hibernate/processor/test/data/reactive/RepoWithPrimary.java diff --git a/tooling/metamodel-generator/src/jakartaData/java/org/hibernate/processor/test/data/reactive/ReactiveTest.java b/tooling/metamodel-generator/src/jakartaData/java/org/hibernate/processor/test/data/reactive/ReactiveTest.java index 542306b196e0..094ea9207bb7 100644 --- a/tooling/metamodel-generator/src/jakartaData/java/org/hibernate/processor/test/data/reactive/ReactiveTest.java +++ b/tooling/metamodel-generator/src/jakartaData/java/org/hibernate/processor/test/data/reactive/ReactiveTest.java @@ -16,7 +16,7 @@ */ public class ReactiveTest extends CompilationTest { @Test - @WithClasses({ Publisher.class, Author.class, Address.class, Book.class, Library.class, Library2.class }) + @WithClasses({ Publisher.class, Author.class, Address.class, Book.class, Library.class, Library2.class, RepoWithPrimary.class }) public void test() { System.out.println( getMetaModelSourceAsString( Author.class ) ); System.out.println( getMetaModelSourceAsString( Book.class ) ); diff --git a/tooling/metamodel-generator/src/jakartaData/java/org/hibernate/processor/test/data/reactive/RepoWithPrimary.java b/tooling/metamodel-generator/src/jakartaData/java/org/hibernate/processor/test/data/reactive/RepoWithPrimary.java new file mode 100644 index 000000000000..832be0cfe804 --- /dev/null +++ b/tooling/metamodel-generator/src/jakartaData/java/org/hibernate/processor/test/data/reactive/RepoWithPrimary.java @@ -0,0 +1,22 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.processor.test.data.reactive; + +import io.smallrye.mutiny.Uni; +import jakarta.data.repository.Delete; +import jakarta.data.repository.Insert; +import jakarta.data.repository.Repository; +import org.hibernate.reactive.mutiny.Mutiny; + +@Repository +public interface RepoWithPrimary { + Uni session(); //required + @Insert + Uni insert(Book book); + @Delete + Uni delete(Book book); + @Delete + Uni deleteById(String isbn); +} diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractCriteriaMethod.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractCriteriaMethod.java index 8639056e6969..26e904b75ab1 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractCriteriaMethod.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractCriteriaMethod.java @@ -137,11 +137,7 @@ void createCriteriaQuery(StringBuilder declaration) { private void createBuilder(StringBuilder declaration) { declaration .append("\tvar _builder = ") - .append(localSessionName()); - if ( isReactive() ) { - declaration.append(".getFactory()"); - } - declaration + .append(localSessionName()) .append(".getCriteriaBuilder();\n"); } diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMetaEntity.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMetaEntity.java index eca690965215..4eba3ffa44ae 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMetaEntity.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMetaEntity.java @@ -1494,20 +1494,42 @@ else if ( hasAnnotation( method, JD_DELETE ) ) { private void addDeleteMethod(ExecutableElement method, @Nullable TypeMirror returnType) { if ( returnType != null ) { - final TypeKind kind = returnType.getKind(); - if ( kind != TypeKind.VOID - && kind != TypeKind.INT - && kind != TypeKind.LONG ) { - message(method, - "must be 'void' or return 'int' or 'long'", - Diagnostic.Kind.ERROR); + if ( isReactive() + ? isLegalReactiveDeleteReturnType(returnType) + : isLegalDeleteReturnType(returnType) ) { + createCriteriaDelete(method); } else { - createCriteriaDelete(method); + message(method, + isReactive() + ? "must be 'Uni' or 'Uni'" + : "must be 'void' or return 'int' or 'long'", + Diagnostic.Kind.ERROR); } } } + private static boolean isLegalDeleteReturnType(TypeMirror returnType) { + final TypeKind kind = returnType.getKind(); + return kind == TypeKind.VOID + || kind == TypeKind.INT + || kind == TypeKind.LONG; + } + + private static boolean isLegalReactiveDeleteReturnType(TypeMirror returnType) { + final TypeKind kind = returnType.getKind(); + if ( kind == TypeKind.DECLARED ) { + final DeclaredType type = (DeclaredType) returnType; + final TypeElement typeElement = (TypeElement) type.asElement(); + final Name name = typeElement.getQualifiedName(); + return name.contentEquals( Void.class.getName() ) + || name.contentEquals( Integer.class.getName() ); + } + else { + return false; + } + } + private void addLifecycleMethod(ExecutableElement method) { final TypeMirror returnType = unUniIfPossible( method, method.getReturnType() ); if ( method.getParameters().size() != 1 ) { diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/CriteriaDeleteMethod.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/CriteriaDeleteMethod.java index 02fa0836fa71..ed78a0c4b9b8 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/CriteriaDeleteMethod.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/CriteriaDeleteMethod.java @@ -62,8 +62,10 @@ void executeQuery(StringBuilder declaration, List paramTypes) { } void tryReturn(StringBuilder declaration) { - declaration - .append("\n\ttry {\n\t\t"); + if ( !isReactive() ) { + declaration + .append("\n\ttry {\n\t\t"); + } if ( !"void".equals(fullReturnType) ) { declaration .append("return "); @@ -72,7 +74,7 @@ void tryReturn(StringBuilder declaration) { @Override String createQueryMethod() { - return isUsingEntityManager() || isReactive() + return isUsingEntityManager() ? "createQuery" : "createMutationQuery"; } @@ -85,6 +87,11 @@ String specificationType() { private void execute(StringBuilder declaration) { declaration .append("\t\t\t.executeUpdate()"); + if ( isReactive() ) { + if ( fullReturnType.endsWith("") ) {} + declaration + .append(".replaceWithVoid()"); + } } @Override From c60b711adb2abaf7159c9c59278ee63fa0f8676c Mon Sep 17 00:00:00 2001 From: Gavin King Date: Thu, 26 Jun 2025 20:48:49 +0200 Subject: [PATCH 2/2] update to latest Quarkus and Reactive in Processor tests --- tooling/metamodel-generator/hibernate-processor.gradle | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tooling/metamodel-generator/hibernate-processor.gradle b/tooling/metamodel-generator/hibernate-processor.gradle index 7570e319f331..51ba5d86fd50 100644 --- a/tooling/metamodel-generator/hibernate-processor.gradle +++ b/tooling/metamodel-generator/hibernate-processor.gradle @@ -57,11 +57,11 @@ dependencies { api libs.byteBuddy api libs.logging - quarkusOrmPanacheImplementation "io.quarkus:quarkus-hibernate-orm-panache:3.6.2" - quarkusHrPanacheImplementation "io.quarkus:quarkus-hibernate-reactive-panache:3.6.2" + quarkusOrmPanacheImplementation "io.quarkus:quarkus-hibernate-orm-panache:3.24.1" + quarkusHrPanacheImplementation "io.quarkus:quarkus-hibernate-reactive-panache:3.24.1" jakartaDataImplementation "jakarta.data:jakarta.data-api:1.0.0" - jakartaDataImplementation "org.hibernate.reactive:hibernate-reactive-core:2.2.2.Final" - jakartaDataImplementation "io.quarkus:quarkus-hibernate-orm-panache:3.6.2" + jakartaDataImplementation "org.hibernate.reactive:hibernate-reactive-core:3.0.1.Final" + jakartaDataImplementation "io.quarkus:quarkus-hibernate-orm-panache:3.24.1" } // The source set gets a custom configuration which extends the normal test implementation config