diff --git a/hibernate-core/src/main/java/org/hibernate/boot/internal/StandardEntityNotFoundDelegate.java b/hibernate-core/src/main/java/org/hibernate/boot/internal/StandardEntityNotFoundDelegate.java index e102ff78e74d..c413b496cc6e 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/internal/StandardEntityNotFoundDelegate.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/internal/StandardEntityNotFoundDelegate.java @@ -8,8 +8,8 @@ import org.hibernate.proxy.EntityNotFoundDelegate; /** - * Standard non-JPA implementation of EntityNotFoundDelegate, throwing the - * Hibernate-specific {@link ObjectNotFoundException}. + * Standard non-JPA implementation of {@link EntityNotFoundDelegate}, + * throwing the Hibernate-specific {@link ObjectNotFoundException}. * * @author Steve Ebersole */ diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/usertype/EnhancedUserTypeTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/usertype/EnhancedUserTypeTest.java index f0d6f2f0c0d7..96e53f180ef1 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/usertype/EnhancedUserTypeTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/usertype/EnhancedUserTypeTest.java @@ -1,3 +1,7 @@ +/* + * SPDX-License-Identifier: LGPL-2.1-or-later + * Copyright Red Hat Inc. and Hibernate Authors + */ package org.hibernate.orm.test.annotations.usertype; import org.hibernate.testing.orm.junit.DomainModel; @@ -9,9 +13,9 @@ @DomainModel(annotatedClasses = MyEntity.class) public class EnhancedUserTypeTest { - @Test - void test(SessionFactoryScope scope) { - scope.inTransaction(session -> session.persist(new MyEntity(new MyId("x1"), "hello world"))); - } + @Test + void test(SessionFactoryScope scope) { + scope.inTransaction(session -> session.persist(new MyEntity(new MyId("x1"), "hello world"))); + } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/usertype/MyEntity.java b/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/usertype/MyEntity.java index 7d4f071364f4..336491673ce4 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/usertype/MyEntity.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/usertype/MyEntity.java @@ -1,3 +1,7 @@ +/* + * SPDX-License-Identifier: LGPL-2.1-or-later + * Copyright Red Hat Inc. and Hibernate Authors + */ package org.hibernate.orm.test.annotations.usertype; import jakarta.persistence.Entity; @@ -6,17 +10,17 @@ @Entity class MyEntity { - @Id - @Type(MyType.class) - MyId id; + @Id + @Type(MyType.class) + MyId id; - String content; + String content; - MyEntity(MyId id, String content) { - this.id = id; - this.content = content; - } + MyEntity(MyId id, String content) { + this.id = id; + this.content = content; + } - MyEntity() { - } + MyEntity() { + } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/usertype/MyId.java b/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/usertype/MyId.java index 7c6b3271c6bb..86cc429468f9 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/usertype/MyId.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/usertype/MyId.java @@ -1,9 +1,13 @@ +/* + * SPDX-License-Identifier: LGPL-2.1-or-later + * Copyright Red Hat Inc. and Hibernate Authors + */ package org.hibernate.orm.test.annotations.usertype; class MyId { - final String text; + final String text; - MyId(String text) { - this.text = text; - } + MyId(String text) { + this.text = text; + } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/usertype/MyType.java b/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/usertype/MyType.java index 8c06ddc0831c..538063d37256 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/usertype/MyType.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/usertype/MyType.java @@ -1,3 +1,7 @@ +/* + * SPDX-License-Identifier: LGPL-2.1-or-later + * Copyright Red Hat Inc. and Hibernate Authors + */ package org.hibernate.orm.test.annotations.usertype; import org.hibernate.HibernateException; @@ -11,70 +15,70 @@ import java.sql.SQLException; class MyType implements EnhancedUserType { - @Override - public String toSqlLiteral(MyId value) { - return "'" + value.text.replace("'", "''") + "'"; - } + @Override + public String toSqlLiteral(MyId value) { + return "'" + value.text.replace("'", "''") + "'"; + } - @Override - public String toString(MyId value) throws HibernateException { - return value.text; - } + @Override + public String toString(MyId value) throws HibernateException { + return value.text; + } - @Override - public MyId fromStringValue(CharSequence sequence) throws HibernateException { - return new MyId(sequence.toString()); - } + @Override + public MyId fromStringValue(CharSequence sequence) throws HibernateException { + return new MyId(sequence.toString()); + } - @Override - public int getSqlType() { - return SqlTypes.VARCHAR; - } + @Override + public int getSqlType() { + return SqlTypes.VARCHAR; + } - @Override - public Class returnedClass() { - return MyId.class; - } + @Override + public Class returnedClass() { + return MyId.class; + } - @Override - public boolean equals(MyId x, MyId y) { - return x != null && y != null && x.text.equals(y.text); - } + @Override + public boolean equals(MyId x, MyId y) { + return x != null && y != null && x.text.equals(y.text); + } - @Override - public int hashCode(MyId x) { - return x.text.hashCode(); - } + @Override + public int hashCode(MyId x) { + return x.text.hashCode(); + } - @Override - public MyId nullSafeGet(ResultSet rs, int position, SharedSessionContractImplementor session, Object owner) - throws SQLException { - return new MyId(rs.getString(position)); - } + @Override + public MyId nullSafeGet(ResultSet rs, int position, SharedSessionContractImplementor session, Object owner) + throws SQLException { + return new MyId(rs.getString(position)); + } - @Override - public void nullSafeSet(PreparedStatement st, MyId value, int index, SharedSessionContractImplementor session) - throws SQLException { - st.setString(index, value.text); - } + @Override + public void nullSafeSet(PreparedStatement st, MyId value, int index, SharedSessionContractImplementor session) + throws SQLException { + st.setString(index, value.text); + } - @Override - public MyId deepCopy(MyId value) { - return value; - } + @Override + public MyId deepCopy(MyId value) { + return value; + } - @Override - public boolean isMutable() { - return false; - } + @Override + public boolean isMutable() { + return false; + } - @Override - public Serializable disassemble(MyId value) { - return value.text; - } + @Override + public Serializable disassemble(MyId value) { + return value.text; + } - @Override - public MyId assemble(Serializable cached, Object owner) { - return new MyId((String) cached); - } + @Override + public MyId assemble(Serializable cached, Object owner) { + return new MyId((String) cached); + } } diff --git a/tooling/metamodel-generator/src/jakartaData/java/org/hibernate/processor/test/data/basic/BookAuthorRepository.java b/tooling/metamodel-generator/src/jakartaData/java/org/hibernate/processor/test/data/basic/BookAuthorRepository.java index ce5123095ec3..b34494636977 100644 --- a/tooling/metamodel-generator/src/jakartaData/java/org/hibernate/processor/test/data/basic/BookAuthorRepository.java +++ b/tooling/metamodel-generator/src/jakartaData/java/org/hibernate/processor/test/data/basic/BookAuthorRepository.java @@ -213,4 +213,13 @@ public interface BookAuthorRepository { @Query("") List withNoOrder2(PageRequest pageRequest); + + @Query("update Author set name = :name where ssn = :id") + void updateAuthorAddress1(String id, String name); + + @Query("update Author set name = :name where ssn = :id") + int updateAuthorAddress2(String id, String name); + + @Query("update Author set name = :name where ssn = :id") + boolean updateAuthorAddress3(String id, String name); } diff --git a/tooling/metamodel-generator/src/jakartaData/java/org/hibernate/processor/test/data/reactive/Library.java b/tooling/metamodel-generator/src/jakartaData/java/org/hibernate/processor/test/data/reactive/Library.java index 73c3ddd6b4ca..6de880b943a8 100644 --- a/tooling/metamodel-generator/src/jakartaData/java/org/hibernate/processor/test/data/reactive/Library.java +++ b/tooling/metamodel-generator/src/jakartaData/java/org/hibernate/processor/test/data/reactive/Library.java @@ -107,4 +107,13 @@ record BookWithAuthor(Book book, Author author) {} @Find Uni> authorsByCityAndPostcode(String address_city, String address_postcode); + + @Query("update Author set address = :address where ssn = :id") + Uni updateAuthorAddress1(String id, Address address); + + @Query("update Author set address = :address where ssn = :id") + Uni updateAuthorAddress2(String id, Address address); + + @Query("update Author set address = :address where ssn = :id") + Uni updateAuthorAddress3(String id, Address address); } diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/Context.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/Context.java index fc14378ee271..ca357a3d7b72 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/Context.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/Context.java @@ -92,6 +92,7 @@ public final class Context { private AccessType persistenceUnitDefaultAccessType; private boolean generateJakartaDataStaticMetamodel; private boolean quarkusInjection; + private boolean dataEventPackageAvailable; // keep track of all classes for which model have been generated private final Set generatedModelClasses = new HashSet<>(); @@ -224,6 +225,14 @@ public void setQuarkusInjection(boolean quarkusInjection) { this.quarkusInjection = quarkusInjection; } + public boolean isDataEventPackageAvailable() { + return dataEventPackageAvailable; + } + + public void setDataEventPackageAvailable(boolean dataEventPackageAvailable) { + this.dataEventPackageAvailable = dataEventPackageAvailable; + } + public Elements getElementUtils() { return processingEnvironment.getElementUtils(); } diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/HibernateProcessor.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/HibernateProcessor.java index b926c5d72e58..af3f276da5e0 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/HibernateProcessor.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/HibernateProcessor.java @@ -243,6 +243,9 @@ private boolean handleSettings(ProcessingEnvironment environment) { final PackageElement quarkusOrmPackage = context.getProcessingEnvironment().getElementUtils() .getPackageElement( "io.quarkus.hibernate.orm" ); + final PackageElement dataEventPackage = + context.getProcessingEnvironment().getElementUtils() + .getPackageElement( "jakarta.data.event" ); PackageElement quarkusOrmPanachePackage = context.getProcessingEnvironment().getElementUtils() @@ -265,6 +268,7 @@ && packagePresent(quarkusOrmPanachePackage) ) { context.setAddGeneratedAnnotation( packagePresent(jakartaAnnotationPackage) ); context.setAddDependentAnnotation( packagePresent(jakartaContextPackage) ); context.setAddTransactionScopedAnnotation( packagePresent(jakartaTransactionsPackage) ); + context.setDataEventPackageAvailable( packagePresent(dataEventPackage) ); context.setQuarkusInjection( packagePresent(quarkusOrmPackage) ); context.setUsesQuarkusOrm( packagePresent(quarkusOrmPanachePackage) ); context.setUsesQuarkusReactive( packagePresent(quarkusReactivePanachePackage) ); diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractAnnotatedMethod.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractAnnotatedMethod.java index be3ffcf122dc..fe3f49abb3d2 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractAnnotatedMethod.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractAnnotatedMethod.java @@ -94,7 +94,7 @@ protected void handle(StringBuilder declaration, String handled, String rethrown declaration.append( "\n\t\t\t.onFailure(" ) .append( annotationMetaEntity.importType( handled ) ) .append( ".class)\n" ) - .append( "\t\t\t\t\t.transform((_ex) -> new " ) + .append( "\t\t\t\t\t.transform(_ex -> new " ) .append( annotationMetaEntity.importType( rethrown ) ) .append( "(_ex.getMessage(), _ex))" ); 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 765530d53ddd..83dbefd2a5d6 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 @@ -637,9 +637,24 @@ else if ( element.getKind() == ElementKind.INTERFACE if ( needsDefaultConstructor() ) { addDefaultConstructor(); } + if ( needsEventBus() ) { + addEventBus(); + } } } + private boolean needsEventBus() { + return jakartaDataRepository + && !usingReactiveSession( sessionType ) // non-reactive + && context.isDataEventPackageAvailable() // events + && context.addInjectAnnotation() // @nject + && context.addDependentAnnotation(); // CDI + } + + void addEventBus() { + putMember("_event", new EventField(this) ); + } + /** * For usage with CDI, but outside Quarkus, Jakarta Data * repositories use {@code @PersistenceUnit} to obtain an @@ -685,6 +700,11 @@ boolean needsDefaultConstructor() { return null; } + @Override + public boolean isReactive() { + return usingReactiveSession(sessionType); + } + private boolean isPanacheType(TypeElement type) { return context.usesQuarkusOrm() && isOrmPanacheType( type ) || context.usesQuarkusReactive() && isReactivePanacheType( type ); @@ -1377,6 +1397,7 @@ else if ( returnArgument new LifecycleMethod( this, method, entity, + typeAsString(lifecycleParameterArgument(parameterType)), methodName, parameter.getSimpleName().toString(), getSessionVariableName(), @@ -1419,6 +1440,23 @@ private static LifecycleMethod.ParameterKind lifecycleParameterKind(TypeMirror p } } + private TypeMirror lifecycleParameterArgument(TypeMirror parameterType) { + switch (parameterType.getKind()) { + case ARRAY: + final ArrayType arrayType = (ArrayType) parameterType; + return arrayType.getComponentType(); + case DECLARED: + final DeclaredType declaredType = (DeclaredType) parameterType; + final TypeElement typeElement = (TypeElement) declaredType.asElement(); + return typeElement.getQualifiedName().contentEquals(LIST) + && !declaredType.getTypeArguments().isEmpty() + ? declaredType.getTypeArguments().get(0) + : context.getElementUtils().getTypeElement(JAVA_OBJECT).asType(); + default: + return parameterType; + } + } + private static boolean isVoid(TypeMirror returnType) { switch (returnType.getKind()) { case VOID: diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/EventField.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/EventField.java new file mode 100644 index 000000000000..8c330d8b265a --- /dev/null +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/EventField.java @@ -0,0 +1,66 @@ +/* + * SPDX-License-Identifier: LGPL-2.1-or-later + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.processor.annotation; + +import org.hibernate.processor.model.MetaAttribute; +import org.hibernate.processor.model.Metamodel; +import org.hibernate.processor.util.Constants; + + +/** + * Used by the container to instantiate a Jakarta Data repository. + * + * @author Gavin King + */ +public class EventField implements MetaAttribute { + + private final AnnotationMetaEntity annotationMetaEntity; + + public EventField(AnnotationMetaEntity annotationMetaEntity) { + this.annotationMetaEntity = annotationMetaEntity; + } + + @Override + public boolean hasTypedAttribute() { + return true; + } + + @Override + public boolean hasStringAttribute() { + return false; + } + + @Override + public String getAttributeDeclarationString() { + annotationMetaEntity.importType("jakarta.inject.Inject"); + annotationMetaEntity.importType("jakarta.data.event.LifecycleEvent"); + return "\n@Inject\nprivate Event> event;"; + } + + @Override + public String getAttributeNameDeclarationString() { + throw new UnsupportedOperationException("operation not supported"); + } + + @Override + public String getMetaType() { + throw new UnsupportedOperationException("operation not supported"); + } + + @Override + public String getPropertyName() { + return "event"; + } + + @Override + public String getTypeDeclaration() { + return Constants.ENTITY_MANAGER; + } + + @Override + public Metamodel getHostingEntity() { + return annotationMetaEntity; + } +} diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/LifecycleMethod.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/LifecycleMethod.java index 27fdac7989b8..454dcaad32a8 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/LifecycleMethod.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/LifecycleMethod.java @@ -7,11 +7,15 @@ import javax.lang.model.element.ExecutableElement; +import java.util.Set; + +import static java.lang.Character.toUpperCase; import static org.hibernate.processor.util.Constants.LIST; import static org.hibernate.processor.util.Constants.UNI; public class LifecycleMethod extends AbstractAnnotatedMethod { private final String entity; + private final String actualEntity; private final String methodName; private final String parameterName; private final String operationName; @@ -30,6 +34,7 @@ public LifecycleMethod( AnnotationMetaEntity annotationMetaEntity, ExecutableElement method, String entity, + String actualEntity, String methodName, String parameterName, String sessionName, @@ -41,6 +46,7 @@ public LifecycleMethod( boolean hasGeneratedId) { super(annotationMetaEntity, method, sessionName, sessionType); this.entity = entity; + this.actualEntity = actualEntity; this.methodName = methodName; this.parameterName = parameterName; this.operationName = operationName; @@ -60,21 +66,24 @@ public boolean hasStringAttribute() { return false; } + private String capitalize(String string) { + return toUpperCase(string.charAt(0)) + string.substring(1); + } + + static final Set eventTypes = Set.of("insert", "update", "delete"); + @Override public String getAttributeDeclarationString() { StringBuilder declaration = new StringBuilder(); preamble(declaration); nullCheck(declaration, parameterName); + fireEvents(declaration, "Pre"); if ( !isReactive() ) { declaration.append( "\ttry {\n" ); } delegateCall(declaration); - returnArgument(declaration); + returnArgumentReactively(declaration); if ( !isReactive() ) { - if ( returnArgument ) { - declaration - .append( ";\n" ); - } declaration.append( "\t}\n" ); } convertExceptions( declaration ); @@ -82,10 +91,95 @@ public String getAttributeDeclarationString() { declaration .append( ";\n" ); } + fireEvents(declaration, "Post"); + returnArgument(declaration); declaration.append("}"); return declaration.toString(); } + private void fireEvents(StringBuilder declaration, String prefix) { + if ( annotationMetaEntity.getContext().isDataEventPackageAvailable() + && annotationMetaEntity.getContext().addDependentAnnotation() + && eventTypes.contains( operationName ) + && !isReactive()) { + final String entityName = iterateEvents( declaration ); + fireEvent( declaration, entityName, prefix + capitalize( operationName ) + "Event" ); + endIterateEvents( declaration ); + } + } + + private void fireEvent(StringBuilder declaration, String entityName, String eventType) { + annotationMetaEntity.importType( "jakarta.data.event.LifecycleEvent" ); + annotationMetaEntity.importType( "jakarta.enterprise.util.TypeLiteral" ); + annotationMetaEntity.importType( "jakarta.enterprise.event.Event" ); + annotationMetaEntity.importType( "jakarta.inject.Inject" ); + annotationMetaEntity.importType( "jakarta.data.event." + eventType ); + if (parameterKind != ParameterKind.NORMAL) { + declaration.append( "\t" ); + } + declaration + .append( "\tif (event != null) {\n" ); + if (parameterKind != ParameterKind.NORMAL) { + declaration.append( "\t" ); + } + declaration + .append( "\t\tevent.select(new TypeLiteral<" ) + .append( eventType ) + .append( "<" ) + .append( annotationMetaEntity.importType( actualEntity ) ) + .append( ">>(){})\n\t\t\t\t.fire(new " ) + .append( eventType ) + .append( "<>(" ) + .append( entityName ) + .append( "));\n"); + if (parameterKind != ParameterKind.NORMAL) { + declaration.append( "\t" ); + } + declaration + .append("\t}\n" ); + } + + private void endIterateEvents(StringBuilder declaration) { + if (parameterKind != ParameterKind.NORMAL) { + declaration + .append( "\t}\n"); + } + } + + private String iterateEvents(StringBuilder declaration) { + if (parameterKind != ParameterKind.NORMAL) { + declaration + .append( "\tfor (var _entity : ") + .append( parameterName ) + .append(") {\n" ); + return "_entity"; + } + else { + return parameterName; + } + } + + private void returnArgument(StringBuilder declaration) { + if ( returnArgument && !isReactive() ) { + declaration + .append( "\treturn " ) + .append( parameterName ) + .append( ";\n" ); + } + } + + private void returnArgumentReactively(StringBuilder declaration) { + if ( isReactive() ) { + if ( returnArgument ) { + declaration + .append( "\n\t\t\t.replaceWith(") + .append(parameterName) + .append(")"); + } + } + } + + private void convertExceptions(StringBuilder declaration) { if ( operationName.equals("insert") ) { handle( declaration, @@ -102,23 +196,6 @@ private void convertExceptions(StringBuilder declaration) { "jakarta.data.exceptions.DataException"); } - private void returnArgument(StringBuilder declaration) { - if ( returnArgument ) { - if ( isReactive() ) { - declaration - .append( "\n\t\t\t" ) - .append(".replaceWith(") - .append(parameterName) - .append(")"); - } - else { - declaration - .append("\t\treturn ") - .append(parameterName); - } - } - } - private void delegateCall(StringBuilder declaration) { if ( isReactive() ) { // TODO: handle the case of an iterable parameter @@ -179,7 +256,7 @@ private void argument(StringBuilder declaration) { if ( isReactive() ) { declaration .append("All") - .append("(") + .append("((Object[]) ") .append(parameterName) .append(")"); } diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/QueryMethod.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/QueryMethod.java index 6458c826365a..a624225fcce6 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/QueryMethod.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/QueryMethod.java @@ -80,7 +80,7 @@ boolean isNullable(int index) { @Override boolean singleResult() { - return containerType == null; + return containerType == null && !isUpdate; } @Override @@ -150,11 +150,22 @@ && isUsingEntityManager() ) { private void execute(StringBuilder declaration, boolean unwrapped) { if ( isUpdate ) { declaration - .append("\t\t\t") - .append(".executeUpdate()"); - if ( "boolean".equals(returnTypeName) ) { - declaration - .append(" > 0"); + .append("\t\t\t.executeUpdate()"); + if ( isReactive() ) { + if ( Void.class.getName().equals( returnTypeName ) ) { + declaration + .append( "\n\t\t\t.replaceWithVoid()" ); + } + else if ( Boolean.class.getName().equals( returnTypeName ) ) { + declaration + .append( "\n\t\t\t.map(rows -> rows>0)" ); + } + } + else { + if ( "boolean".equals( returnTypeName ) ) { + declaration + .append( " > 0" ); + } } } else { diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/model/Metamodel.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/model/Metamodel.java index 49cdfb09e607..4408e4def0fd 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/model/Metamodel.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/model/Metamodel.java @@ -60,4 +60,8 @@ public interface Metamodel extends ImportContext { List inheritedAnnotations(); String javadoc(); + + default boolean isReactive() { + return false; + } }