From d6390ce79f45b65d054558517ad463b0da3e6c61 Mon Sep 17 00:00:00 2001 From: Yanming Zhou Date: Wed, 7 Feb 2024 17:19:27 +0800 Subject: [PATCH] HHH-17719 Supports boolean as return type of mutation query method --- .../src/main/asciidoc/introduction/Generator.adoc | 8 +++++++- .../java/org/hibernate/annotations/processing/HQL.java | 5 +++-- .../jpamodelgen/annotation/AnnotationMetaEntity.java | 4 +++- .../org/hibernate/jpamodelgen/annotation/QueryMethod.java | 6 +++++- .../test/java/org/hibernate/jpamodelgen/test/dao/Dao.java | 3 +++ 5 files changed, 21 insertions(+), 5 deletions(-) diff --git a/documentation/src/main/asciidoc/introduction/Generator.adoc b/documentation/src/main/asciidoc/introduction/Generator.adoc index 9675579b39..4754fae01d 100644 --- a/documentation/src/main/asciidoc/introduction/Generator.adoc +++ b/documentation/src/main/asciidoc/introduction/Generator.adoc @@ -662,7 +662,7 @@ List books = // }) // ---- -An `insert`, `update`, or `delete` query must return `int` or `void`. +An `insert`, `update`, or `delete` query must return `int`, `boolean`, or `void`. [source,java] ---- @@ -670,6 +670,12 @@ An `insert`, `update`, or `delete` query must return `int` or `void`. int deleteAllBooks(); ---- +[source,java] +---- +@HQL("update Book set discontinued = true where discontinued = false and isbn = :isbn") +boolean discontinueBook(String isbn); +---- + [source,java] ---- @HQL("update Book set discontinued = true where isbn = :isbn") diff --git a/hibernate-core/src/main/java/org/hibernate/annotations/processing/HQL.java b/hibernate-core/src/main/java/org/hibernate/annotations/processing/HQL.java index 5398b62ed3..a5d1069437 100644 --- a/hibernate-core/src/main/java/org/hibernate/annotations/processing/HQL.java +++ b/hibernate-core/src/main/java/org/hibernate/annotations/processing/HQL.java @@ -88,8 +88,8 @@ * *

* For an {@code insert}, {@code update}, or {@code delete} query, - * the return type of the annotated method must be {@code int} or - * {@code void}. + * the return type of the annotated method must be {@code int}, + * {@code boolean}, or {@code void}. *

* The method parameters must match the parameters of the HQL query, * either by name or by position: @@ -125,6 +125,7 @@ * @see Find * * @author Gavin King + * @author Yanming Zhou * @since 6.3 */ @Target(METHOD) diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/jpamodelgen/annotation/AnnotationMetaEntity.java b/tooling/metamodel-generator/src/main/java/org/hibernate/jpamodelgen/annotation/AnnotationMetaEntity.java index 3a8b4210d9..c889b1fc28 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/jpamodelgen/annotation/AnnotationMetaEntity.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/jpamodelgen/annotation/AnnotationMetaEntity.java @@ -83,6 +83,7 @@ * @author Hardy Ferentschik * @author Emmanuel Bernard * @author Gavin King + * @author Yanming Zhou */ public class AnnotationMetaEntity extends AnnotationMeta { @@ -1053,9 +1054,10 @@ private void validateUpdateHql( AnnotationValue value) { if ( returnType == null || returnType.getKind() != TypeKind.VOID + && returnType.getKind() != TypeKind.BOOLEAN && returnType.getKind() != TypeKind.INT ) { context.message( method, mirror, value, - "return type of mutation query method must be 'int' or 'void'", + "return type of mutation query method must be 'int', 'boolean', or 'void'", Diagnostic.Kind.ERROR ); } } diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/jpamodelgen/annotation/QueryMethod.java b/tooling/metamodel-generator/src/main/java/org/hibernate/jpamodelgen/annotation/QueryMethod.java index a1a439c5c7..8fa7f972cc 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/jpamodelgen/annotation/QueryMethod.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/jpamodelgen/annotation/QueryMethod.java @@ -16,6 +16,7 @@ /** * @author Gavin King + * @author Yanming Zhou */ public class QueryMethod extends AbstractQueryMethod { private final String queryString; @@ -116,8 +117,11 @@ private void execute(StringBuilder declaration, boolean unwrapped) { if ( isUpdate ) { declaration .append("\n\t\t\t.executeUpdate()"); + if ( "boolean".equals(returnTypeName) ) { + declaration.append(" > 0"); + } } - else if ( containerTypeName == null) { + else if ( containerTypeName == null ) { declaration .append("\n\t\t\t.getSingleResult()"); } diff --git a/tooling/metamodel-generator/src/test/java/org/hibernate/jpamodelgen/test/dao/Dao.java b/tooling/metamodel-generator/src/test/java/org/hibernate/jpamodelgen/test/dao/Dao.java index 0e57bee5d6..56d95ff587 100644 --- a/tooling/metamodel-generator/src/test/java/org/hibernate/jpamodelgen/test/dao/Dao.java +++ b/tooling/metamodel-generator/src/test/java/org/hibernate/jpamodelgen/test/dao/Dao.java @@ -74,6 +74,9 @@ public interface Dao { @HQL("delete from Book") int deleteBooks(); + @HQL("delete from Book book where book.isbn=:isbn") + boolean deleteBook(String isbn); + @HQL("select count(*), count(*)>1 from Book") Object[] funnyQueryReturningArray();