Repository: quarkusio/quarkus
Pull request #47012: Add Jakarta Data documentation, dependency management and tests
Author: login: marko-bekhta
Labels: name: kind/enhancement
description: New feature or request
name: release/noteworthy-feature
name: area/documentation
name: triage/waiting-for-ci
description: Ready to merge when CI successfully finishes
name: area/dependencies
description: Pull requests that update a dependency file
name: triage/flaky-test
name: area/docstyle
description: issues related for manual docstyle review
Created: 2025-03-26T16:27:34Z | Merged: 2025-04-14T07:33:23Z

fixes https://github.com/quarkusio/quarkus/issues/44278

I wasn't sure if we should just add the tests to the `hibernate-orm-jpamodelgen` hence.. I kept the one in the new module as close to the `hibernate-orm-jpamodelgen` so that if we decide to merge them in that module, it'll be easier. 

I've tested the config for the gradle doc example on a test project and this bit:
```
annotationProcessor enforcedPlatform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}")
```
seems to help with the version management for the AP in the Gradle case.

A quickstart draft PR is here: https://github.com/quarkusio/quarkus-quickstarts/pull/1516


Diff:
diff --git a/bom/application/pom.xml b/bom/application/pom.xml
index a0df2449b6e95..457e12972de2b 100644
--- a/bom/application/pom.xml
+++ b/bom/application/pom.xml
@@ -71,7 +71,8 @@
         <jakarta.json-api.version>2.1.3</jakarta.json-api.version>
         <jakarta.json.bind-api.version>3.0.1</jakarta.json.bind-api.version>
         <jakarta.mail-api.version>2.1.3</jakarta.mail-api.version>
-        <jakarta.persistence-api.version>3.1.0</jakarta.persistence-api.version>
+        <!--jakarta.persistence-api.version is located in the root pom -->
+        <jakarta.data-api.version>1.0.1</jakarta.data-api.version>
         <jakarta.resource-api.version>2.1.0</jakarta.resource-api.version>
         <jakarta.servlet-api.version>6.0.0</jakarta.servlet-api.version>
         <jakarta.transaction-api.version>2.0.1</jakarta.transaction-api.version>
@@ -4390,6 +4391,11 @@
                 <artifactId>jakarta.persistence-api</artifactId>
                 <version>${jakarta.persistence-api.version}</version>
             </dependency>
+            <dependency>
+                <groupId>jakarta.data</groupId>
+                <artifactId>jakarta.data-api</artifactId>
+                <version>${jakarta.data-api.version}</version>
+            </dependency>
             <dependency>
                 <groupId>jakarta.resource</groupId>
                 <artifactId>jakarta.resource-api</artifactId>
diff --git a/docs/pom.xml b/docs/pom.xml
index bc1cddaa15c54..ad1ce9884bf16 100644
--- a/docs/pom.xml
+++ b/docs/pom.xml
@@ -3230,6 +3230,17 @@
                             <versionString>${hibernate-validator.version}</versionString>
                         </configuration>
                     </execution>
+                    <execution>
+                        <id>parse-version-jakarta-persistence</id>
+                        <goals>
+                            <goal>parse-version</goal>
+                        </goals>
+                        <phase>validate</phase>
+                        <configuration>
+                            <propertyPrefix>jakarta-persistence</propertyPrefix>
+                            <versionString>${jakarta.persistence-api.version}</versionString>
+                        </configuration>
+                    </execution>
                 </executions>
             </plugin>
             <plugin>
diff --git a/docs/src/main/asciidoc/_attributes.adoc b/docs/src/main/asciidoc/_attributes.adoc
index b91b5fe9eab66..5e2f6023a7a7a 100644
--- a/docs/src/main/asciidoc/_attributes.adoc
+++ b/docs/src/main/asciidoc/_attributes.adoc
@@ -30,6 +30,7 @@
 :hibernate-orm-version-major-minor: ${hibernate-orm.majorVersion}.${hibernate-orm.minorVersion}
 :hibernate-search-version-major-minor: ${hibernate-search.majorVersion}.${hibernate-search.minorVersion}
 :hibernate-validator-version-major-minor: ${hibernate-validator.majorVersion}.${hibernate-validator.minorVersion}
+:jakarta-persistence-version-major-minor: ${jakarta-persistence.majorVersion}.${jakarta-persistence.minorVersion}
 // .
 :quarkus-home-url: ${quarkus-home-url}
 :quarkus-org-url: https://github.com/quarkusio
@@ -56,6 +57,7 @@
 :hibernate-orm-dialect-docs-url: https://docs.jboss.org/hibernate/orm/{hibernate-orm-version-major-minor}/dialect/dialect.html
 :hibernate-search-docs-url: https://docs.jboss.org/hibernate/search/{hibernate-search-version-major-minor}/reference/en-US/html_single/
 :hibernate-validator-docs-url: https://docs.jboss.org/hibernate/validator/{hibernate-validator-version-major-minor}/reference/en-US/html_single/
+:jakarta-persistence-spec-url: https://jakarta.ee/specifications/persistence/{jakarta-persistence-version-major-minor}/jakarta-persistence-spec-{jakarta-persistence-version-major-minor}#a6072
 // .
 :amazon-services-guide: https://docs.quarkiverse.io/quarkus-amazon-services/dev/index.html
 :config-consul-guide: https://docs.quarkiverse.io/quarkus-config-extensions/dev/consul.html
diff --git a/docs/src/main/asciidoc/hibernate-orm.adoc b/docs/src/main/asciidoc/hibernate-orm.adoc
index 9f951ccbebc8f..a750316197db4 100644
--- a/docs/src/main/asciidoc/hibernate-orm.adoc
+++ b/docs/src/main/asciidoc/hibernate-orm.adoc
@@ -1646,3 +1646,134 @@ try {
 Since Quarkus has built-in exception mappers for `jakarta.validation.ConstraintViolationException`,
 explicitly handling these exceptions might be redundant. See the xref:validation.adoc#rest-end-point-validation[REST end point validation]
 section of the Hibernate Validator guide for more details.
+
+[[jakarta-data]]
+== Static metamodel and Jakarta Data
+
+Both static metamodel and Jakarta Data capabilities of Hibernate ORM are available in Quarkus
+through the `hibernate-jpamodelgen` annotation processor. Since it is an annotation processor,
+you must configure the annotation processor in your build tool:
+
+[source,xml,role="primary asciidoc-tabs-target-sync-cli asciidoc-tabs-target-sync-maven"]
+.pom.xml
+----
+<plugin>
+    <artifactId>maven-compiler-plugin</artifactId>
+    <configuration>
+        <annotationProcessorPaths>
+            <path>
+                <groupId>org.hibernate.orm</groupId>
+                <artifactId>hibernate-jpamodelgen</artifactId>
+                <!-- Note, no artifact version is required, it's managed by Quarkus.  -->
+            </path>
+            <!-- other processors that may be required by your app -->
+        </annotationProcessorPaths>
+        <!-- Other compiler plugin configuration options -->
+    </configuration>
+</plugin>
+----
+
+[source,gradle,role="secondary asciidoc-tabs-target-sync-gradle"]
+.build.gradle
+----
+// Enforce the version management of your annotation processor dependencies,
+// so that there's no need to define an explicit version of the hibernate-jpamodelgen
+annotationProcessor enforcedPlatform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}")
+annotationProcessor 'org.hibernate.orm:hibernate-jpamodelgen'
+----
+
+=== Static metamodel
+
+The generated static metamodel allows for building queries in a type-safe manner.
+Let's consider having a simple entity:
+
+[source,java]
+----
+@Entity
+public class MyEntity {
+    @Id
+    @GeneratedValue
+    public Integer id;
+
+    @Column(unique = true)
+    public String name;
+}
+----
+
+A query created with the help of static metamodel may look as:
+
+[source,java]
+----
+var builder = session.getCriteriaBuilder();
+var criteria = builder.createQuery(MyEntity.class);
+var e = criteria.from(MyEntity_.class);
+criteria.where(e.get(MyEntity_.name).equalTo(name));
+var query = session.createQuery(criteria);
+var result = query.list();
+----
+
+For a more detailed overview of static metamodel, please refer to the link:{jakarta-persistence-spec-url}#a6072[Jakarta Persistence specification].
+
+=== Jakarta Data
+
+Jakarta Data requires, besides having the `hibernate-jpamodelgen` annotation processor in place, one extra dependency to be added:
+
+[source,xml,role="primary asciidoc-tabs-target-sync-cli asciidoc-tabs-target-sync-maven"]
+.pom.xml
+----
+<dependency>
+    <groupId>jakarta.data</groupId>
+    <artifactId>jakarta.data-api</artifactId>
+</dependency>
+----
+
+[source,gradle,role="secondary asciidoc-tabs-target-sync-gradle"]
+.build.gradle
+----
+implementation 'jakarta.data:jakarta.data-api'
+----
+
+With this dependency, and the annotation processor in place you could simply create your repositories as follows:
+
+[source,java]
+----
+@Repository
+public interface MyRepository extends CrudRepository<MyEntity, Integer> { // <1>
+
+    @Query("select e from MyEntity e where e.name like :name") // <2>
+    List<MyEntity> findByName(String name);
+
+    @Delete // <3>
+    void delete(String name);
+
+}
+----
+1. To skip the boilerplate definition of CRUD operations,
+we can use one of the available interfaces (e.g. `CrudRepository` or `BasicRepository`).
+2. Adding custom queries with parameters is as easy as providing your query string to the `@Query` annotation.
+3. If the basic CRUD operations from the Jakarta Data interfaces are not enough,
+we can always add a custom one, in this case a delete operation that removes `MyEntity`s by name.
+
+And then the repository can be used as any other bean:
+
+[source,java]
+----
+public class MyEntityResource {
+
+    @Inject
+    MyRepository repository;
+
+    @POST
+    @Transactional
+    public void create(MyEntity entity) {
+        repository.insert(entity);
+    }
+
+	// ...
+
+}
+----
+
+Please refer to the corresponding https://hibernate.org/repositories/[Hibernate Data Repositories]
+and https://jakarta.ee/specifications/data/1.0/jakarta-data-1.0[Jakarta Data]
+guides to learn what else they have to offer.
diff --git a/integration-tests/hibernate-orm-data/pom.xml b/integration-tests/hibernate-orm-data/pom.xml
new file mode 100644
index 0000000000000..66d2437bc6c98
--- /dev/null
+++ b/integration-tests/hibernate-orm-data/pom.xml
@@ -0,0 +1,148 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>quarkus-integration-tests-parent</artifactId>
+        <groupId>io.quarkus</groupId>
+        <version>999-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>quarkus-integration-test-hibernate-orm-data</artifactId>
+    <name>Quarkus - Integration Tests - Hibernate ORM with Jakarta Data</name>
+
+    <dependencies>
+        <dependency>
+            <groupId>io.quarkus</groupId>
+            <artifactId>quarkus-hibernate-orm</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>jakarta.data</groupId>
+            <artifactId>jakarta.data-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.quarkus</groupId>
+            <artifactId>quarkus-rest</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.quarkus</groupId>
+            <artifactId>quarkus-rest-jackson</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.quarkus</groupId>
+            <artifactId>quarkus-jdbc-h2</artifactId>
+        </dependency>
+
+        <!-- test dependencies -->
+        <dependency>
+            <groupId>io.quarkus</groupId>
+            <artifactId>quarkus-junit5</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>io.quarkus</groupId>
+            <artifactId>quarkus-junit5-internal</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>io.rest-assured</groupId>
+            <artifactId>rest-assured</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.assertj</groupId>
+            <artifactId>assertj-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <!-- Minimal test dependencies to *-deployment artifacts for consistent build order -->
+        <dependency>
+            <groupId>io.quarkus</groupId>
+            <artifactId>quarkus-hibernate-orm-deployment</artifactId>
+            <version>${project.version}</version>
+            <type>pom</type>
+            <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>*</groupId>
+                    <artifactId>*</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>io.quarkus</groupId>
+            <artifactId>quarkus-jdbc-h2-deployment</artifactId>
+            <version>${project.version}</version>
+            <type>pom</type>
+            <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>*</groupId>
+                    <artifactId>*</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>io.quarkus</groupId>
+            <artifactId>quarkus-rest-deployment</artifactId>
+            <version>${project.version}</version>
+            <type>pom</type>
+            <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>*</groupId>
+                    <artifactId>*</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>io.quarkus</groupId>
+            <artifactId>quarkus-rest-jackson-deployment</artifactId>
+            <version>${project.version}</version>
+            <type>pom</type>
+            <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>*</groupId>
+                    <artifactId>*</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <filtering>true</filtering>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>io.quarkus</groupId>
+                <artifactId>quarkus-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>build</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <annotationProcessorPaths>
+                        <path>
+                            <groupId>org.hibernate.orm</groupId>
+                            <artifactId>hibernate-jpamodelgen</artifactId>
+                        </path>
+                    </annotationProcessorPaths>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+
+</project>
diff --git a/integration-tests/hibernate-orm-data/src/main/java/io/quarkus/it/hibernate/jpamodelgen/data/MyEntity.java b/integration-tests/hibernate-orm-data/src/main/java/io/quarkus/it/hibernate/jpamodelgen/data/MyEntity.java
new file mode 100644
index 0000000000000..0c12769a65e80
--- /dev/null
+++ b/integration-tests/hibernate-orm-data/src/main/java/io/quarkus/it/hibernate/jpamodelgen/data/MyEntity.java
@@ -0,0 +1,30 @@
+package io.quarkus.it.hibernate.jpamodelgen.data;
+
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.Id;
+
+@Entity
+public class MyEntity {
+
+    @Id
+    @GeneratedValue
+    public Integer id;
+
+    @Column(unique = true)
+    public String name;
+
+    MyEntity() {
+    }
+
+    public MyEntity(String name) {
+        this.name = name;
+    }
+
+    @Override
+    public String toString() {
+        return "MyOrmEntity [id=" + id + ", name=" + name + "]";
+    }
+
+}
diff --git a/integration-tests/hibernate-orm-data/src/main/java/io/quarkus/it/hibernate/jpamodelgen/data/MyEntityResource.java b/integration-tests/hibernate-orm-data/src/main/java/io/quarkus/it/hibernate/jpamodelgen/data/MyEntityResource.java
new file mode 100644
index 0000000000000..5572299945ca6
--- /dev/null
+++ b/integration-tests/hibernate-orm-data/src/main/java/io/quarkus/it/hibernate/jpamodelgen/data/MyEntityResource.java
@@ -0,0 +1,59 @@
+package io.quarkus.it.hibernate.jpamodelgen.data;
+
+import java.util.List;
+
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import jakarta.transaction.Transactional;
+import jakarta.ws.rs.Consumes;
+import jakarta.ws.rs.DELETE;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.NotFoundException;
+import jakarta.ws.rs.POST;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.Produces;
+
+import org.jboss.resteasy.reactive.RestPath;
+
+@ApplicationScoped
+@Produces("application/json")
+@Consumes("application/json")
+@Path("/data/")
+public class MyEntityResource {
+
+    @Inject
+    MyRepository repository;
+
+    @POST
+    @Transactional
+    public void create(MyEntity entity) {
+        repository.insert(entity);
+    }
+
+    @GET
+    @Transactional
+    @Path("/by/name/{name}")
+    public MyEntity getByName(@RestPath String name) {
+        List<MyEntity> entities = repository.findByName(name);
+        if (entities.isEmpty()) {
+            throw new NotFoundException();
+        }
+        return entities.get(0);
+    }
+
+    @POST
+    @Transactional
+    @Path("/rename/{before}/to/{after}")
+    public void rename(@RestPath String before, @RestPath String after) {
+        MyEntity byName = getByName(before);
+        byName.name = after;
+        repository.update(byName);
+    }
+
+    @DELETE
+    @Transactional
+    @Path("/by/name/{name}")
+    public void deleteByName(@RestPath String name) {
+        repository.delete(name);
+    }
+}
diff --git a/integration-tests/hibernate-orm-data/src/main/java/io/quarkus/it/hibernate/jpamodelgen/data/MyRepository.java b/integration-tests/hibernate-orm-data/src/main/java/io/quarkus/it/hibernate/jpamodelgen/data/MyRepository.java
new file mode 100644
index 0000000000000..d2c2073ec3be6
--- /dev/null
+++ b/integration-tests/hibernate-orm-data/src/main/java/io/quarkus/it/hibernate/jpamodelgen/data/MyRepository.java
@@ -0,0 +1,19 @@
+package io.quarkus.it.hibernate.jpamodelgen.data;
+
+import java.util.List;
+
+import jakarta.data.repository.CrudRepository;
+import jakarta.data.repository.Delete;
+import jakarta.data.repository.Query;
+import jakarta.data.repository.Repository;
+
+@Repository
+public interface MyRepository extends CrudRepository<MyEntity, Integer> {
+
+    @Query("select e from MyEntity e where e.name like :name")
+    List<MyEntity> findByName(String name);
+
+    @Delete
+    void delete(String name);
+
+}
diff --git a/integration-tests/hibernate-orm-data/src/main/resources/application.properties b/integration-tests/hibernate-orm-data/src/main/resources/application.properties
new file mode 100644
index 0000000000000..0c8f975c6ca56
--- /dev/null
+++ b/integration-tests/hibernate-orm-data/src/main/resources/application.properties
@@ -0,0 +1,2 @@
+quarkus.datasource.jdbc.max-size=8
+quarkus.hibernate-orm.database.generation=drop-and-create
diff --git a/integration-tests/hibernate-orm-data/src/test/java/io/quarkus/it/hibernate/jpamodelgen/data/HibernateOrmDataInGraalIT.java b/integration-tests/hibernate-orm-data/src/test/java/io/quarkus/it/hibernate/jpamodelgen/data/HibernateOrmDataInGraalIT.java
new file mode 100644
index 0000000000000..64175aee5e43a
--- /dev/null
+++ b/integration-tests/hibernate-orm-data/src/test/java/io/quarkus/it/hibernate/jpamodelgen/data/HibernateOrmDataInGraalIT.java
@@ -0,0 +1,8 @@
+package io.quarkus.it.hibernate.jpamodelgen.data;
+
+import io.quarkus.test.junit.QuarkusIntegrationTest;
+
+@QuarkusIntegrationTest
+public class HibernateOrmDataInGraalIT extends HibernateOrmDataTest {
+
+}
diff --git a/integration-tests/hibernate-orm-data/src/test/java/io/quarkus/it/hibernate/jpamodelgen/data/HibernateOrmDataTest.java b/integration-tests/hibernate-orm-data/src/test/java/io/quarkus/it/hibernate/jpamodelgen/data/HibernateOrmDataTest.java
new file mode 100644
index 0000000000000..928f783b4692e
--- /dev/null
+++ b/integration-tests/hibernate-orm-data/src/test/java/io/quarkus/it/hibernate/jpamodelgen/data/HibernateOrmDataTest.java
@@ -0,0 +1,71 @@
+package io.quarkus.it.hibernate.jpamodelgen.data;
+
+import static io.restassured.RestAssured.given;
+
+import org.junit.jupiter.api.Test;
+
+import io.quarkus.test.junit.QuarkusTest;
+import io.restassured.http.ContentType;
+
+@QuarkusTest
+public class HibernateOrmDataTest {
+    private static final String ROOT = "/data";
+
+    @Test
+    public void staticMetamodel() {
+        // Create/retrieve
+        given()
+                .pathParam("name", "foo")
+                .contentType(ContentType.JSON)
+                .when().get(ROOT + "/by/name/{name}")
+                .then()
+                .statusCode(404);
+        given()
+                .body(new MyEntity("foo"))
+                .contentType(ContentType.JSON)
+                .when().post(ROOT)
+                .then()
+                .statusCode(204);
+        given()
+                .pathParam("name", "foo")
+                .contentType(ContentType.JSON)
+                .when().get(ROOT + "/by/name/{name}")
+                .then()
+                .statusCode(200);
+
+        // Update
+        given()
+                .pathParam("name", "bar")
+                .contentType(ContentType.JSON)
+                .when().get(ROOT + "/by/name/{name}")
+                .then()
+                .statusCode(404);
+        given()
+                .pathParam("before", "foo")
+                .pathParam("after", "bar")
+                .contentType(ContentType.JSON)
+                .when().post(ROOT + "/rename/{before}/to/{after}")
+                .then()
+                .statusCode(204);
+        given()
+                .pathParam("name", "bar")
+                .contentType(ContentType.JSON)
+                .when().get(ROOT + "/by/name/{name}")
+                .then()
+                .statusCode(200);
+
+        // Delete
+        given()
+                .pathParam("name", "bar")
+                .contentType(ContentType.JSON)
+                .when().delete(ROOT + "/by/name/{name}")
+                .then()
+                .statusCode(204);
+        given()
+                .pathParam("name", "bar")
+                .contentType(ContentType.JSON)
+                .when().get(ROOT + "/by/name/{name}")
+                .then()
+                .statusCode(404);
+    }
+}
diff --git a/integration-tests/pom.xml b/integration-tests/pom.xml
index ee572ee589bcc..c56a7a3b3ac1f 100644
--- a/integration-tests/pom.xml
+++ b/integration-tests/pom.xml
@@ -230,6 +230,7 @@
                 <module>hibernate-search-standalone-opensearch</module>
                 <module>hibernate-orm-tenancy</module>
                 <module>hibernate-orm-jpamodelgen</module>
+                <module>hibernate-orm-data</module>
                 <module>hibernate-orm-envers</module>
                 <module>vertx-http</module>
                 <module>vertx-http-compressors</module>
diff --git a/pom.xml b/pom.xml
index b69ce5df3ac26..f350a81e16186 100644
--- a/pom.xml
+++ b/pom.xml
@@ -72,6 +72,7 @@
         <kubernetes-client.version>7.1.0</kubernetes-client.version> <!-- Please check with Java Operator SDK team before updating -->
         <rest-assured.version>5.5.1</rest-assured.version>
         <hibernate-orm.version>6.6.13.Final</hibernate-orm.version> <!-- WARNING when updating, also align the versions below -->
+        <jakarta.persistence-api.version>3.1.0</jakarta.persistence-api.version> <!-- version controlled by Hibernate ORM's needs -->
         <antlr.version>4.13.0</antlr.version> <!-- version controlled by Hibernate ORM's needs -->
         <bytebuddy.version>1.15.11</bytebuddy.version> <!-- version controlled by Hibernate ORM's needs -->
         <hibernate-commons-annotations.version>7.0.3.Final</hibernate-commons-annotations.version> <!-- version controlled by Hibernate ORM's needs -->


Reviews:
user: login: FroMage
body: I'll defer approuval to @yrodiere 
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-28T14:26:28Z
user: login: marko-bekhta
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-28T14:30:53Z
user: login: marko-bekhta
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-28T14:33:17Z
user: login: FroMage
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-28T14:43:44Z
user: login: FroMage
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-28T14:44:08Z
user: login: marko-bekhta
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-28T15:14:29Z
user: login: gsmet
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-02T16:09:31Z
user: login: yrodiere
body: > I'll defer approuval to @yrodiere

A few comments below, but I'm approuving. Thank you!
Feel free to address what you agree with, then let's merge.

<sup><sub>Baguette, omelette au fromage.</sub></sup>
state: APPROVED
author_association: MEMBER
submitted_at: 2025-04-11T11:37:44Z

Review comments:
diff_hunk: @@ -1569,3 +1569,138 @@ Format mappers *must* have both `@PersistenceUnitExtension` and either `@JsonFor
 
 Having multiple JSON (or XML) format mappers registered for the same persistence unit will result in an exception, because of the ambiguity.
 ====
+
+[[jakarta-data]]
+== Static metamodel and Jakarta Data
+
+Both static metamodel and Jakarta Data capabilities of Hibernate ORM are available to the users
+through the `hibernate-jpamodelgen` annotation processor. Since it is an annotation processor,
+users are required to make an extra step of configuring the annotation processor in their build tool of choice:
+
+[source,xml,role="primary asciidoc-tabs-target-sync-cli asciidoc-tabs-target-sync-maven"]
+.pom.xml
+----
+<plugin>
+    <artifactId>maven-compiler-plugin</artifactId>
+    <configuration>
+        <annotationProcessorPaths>
+            <path>
+                <groupId>org.hibernate.orm</groupId>
+                <artifactId>hibernate-jpamodelgen</artifactId>
+                <!-- Note, no artifact version is required, it's managed by Quarkus.  -->
+            </path>
+            <!-- other processors that may be required by your app -->
+        </annotationProcessorPaths>
+        <!-- Other compiler plugin configuration options -->
+    </configuration>
+</plugin>
+----
+
+[source,gradle,role="secondary asciidoc-tabs-target-sync-gradle"]
+.build.gradle
+----
+// Enforce the version management of your annotation processor dependencies,
+// so that there's no need to define an explicit version of the hibernate-jpamodelgen
+annotationProcessor enforcedPlatform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}")
+annotationProcessor 'org.hibernate.orm:hibernate-jpamodelgen'
+----
+
+=== Static metamodel
+
+The generated static metamodel allows for building queries in a type-safe manner.
+Let's consider having a simple entity:
+
+[source,java]
+----
+@Entity
+public class MyEntity {
+    @Id
+    @GeneratedValue
+    public Integer id;
+
+    @Column(unique = true)
+    public String name;
+}
+----
+
+A query created with the help of static metamodel may look as:
+
+[source,java]
+----
+var builder = session.getCriteriaBuilder();
+var query = builder.createQuery(MyEntity.class);
+var e = query.from(MyEntity_.class_);
path: docs/src/main/asciidoc/hibernate-orm.adoc
user: login: FroMage
body: ```suggestion
var e = query.from(MyEntity_.class);
```
created_at: 2025-03-28T14:22:34Z
author_association: MEMBER
diff_hunk: @@ -1569,3 +1569,138 @@ Format mappers *must* have both `@PersistenceUnitExtension` and either `@JsonFor
 
 Having multiple JSON (or XML) format mappers registered for the same persistence unit will result in an exception, because of the ambiguity.
 ====
+
+[[jakarta-data]]
+== Static metamodel and Jakarta Data
+
+Both static metamodel and Jakarta Data capabilities of Hibernate ORM are available to the users
+through the `hibernate-jpamodelgen` annotation processor. Since it is an annotation processor,
+users are required to make an extra step of configuring the annotation processor in their build tool of choice:
+
+[source,xml,role="primary asciidoc-tabs-target-sync-cli asciidoc-tabs-target-sync-maven"]
+.pom.xml
+----
+<plugin>
+    <artifactId>maven-compiler-plugin</artifactId>
+    <configuration>
+        <annotationProcessorPaths>
+            <path>
+                <groupId>org.hibernate.orm</groupId>
+                <artifactId>hibernate-jpamodelgen</artifactId>
+                <!-- Note, no artifact version is required, it's managed by Quarkus.  -->
+            </path>
+            <!-- other processors that may be required by your app -->
+        </annotationProcessorPaths>
+        <!-- Other compiler plugin configuration options -->
+    </configuration>
+</plugin>
+----
+
+[source,gradle,role="secondary asciidoc-tabs-target-sync-gradle"]
+.build.gradle
+----
+// Enforce the version management of your annotation processor dependencies,
+// so that there's no need to define an explicit version of the hibernate-jpamodelgen
+annotationProcessor enforcedPlatform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}")
+annotationProcessor 'org.hibernate.orm:hibernate-jpamodelgen'
+----
+
+=== Static metamodel
+
+The generated static metamodel allows for building queries in a type-safe manner.
+Let's consider having a simple entity:
+
+[source,java]
+----
+@Entity
+public class MyEntity {
+    @Id
+    @GeneratedValue
+    public Integer id;
+
+    @Column(unique = true)
+    public String name;
+}
+----
+
+A query created with the help of static metamodel may look as:
+
+[source,java]
+----
+var builder = session.getCriteriaBuilder();
+var query = builder.createQuery(MyEntity.class);
+var e = query.from(MyEntity_.class_);
+query.where(e.get(MyEntity_.name).equalTo(name));
+session.createQuery(query)....
+----
+
+For a more detailed overview of static metamodel, please refer to the link:{jakarta-persistence-spec-url}#a6072[Jakarta Persistence specification]
+
+=== Jakarta Data
+
+Jakarta Data requires, besides having the `hibernate-jpamodelgen` annotation processor in place, one extra dependency to be added:
+
+[source,xml,role="primary asciidoc-tabs-target-sync-cli asciidoc-tabs-target-sync-maven"]
+.pom.xml
+----
+<dependency>
+    <groupId>jakarta.data</groupId>
+    <artifactId>jakarta.data-api</artifactId>
+</dependency>
+----
+
+[source,gradle,role="secondary asciidoc-tabs-target-sync-gradle"]
+.build.gradle
+----
+implementation 'jakarta.data:jakarta.data-api'
+----
+
+With this dependency, and the annotation processor in place you could simply create your repositories as follows:
+
+[source,java]
+----
+@Repository
+public interface MyRepository {
+
+    @Find
+    Optional<MyEntity> findById(Integer id);
+
+    @Query("select e from MyEntity e where e.name like :name")
+    List<MyEntity> findByName(String name);
+
+    @Insert
path: docs/src/main/asciidoc/hibernate-orm.adoc
user: login: FroMage
body: If you're going to add insert/update/delete we might as well instead show an example extending the `CRUDRepository<MyEntity>`
created_at: 2025-03-28T14:23:46Z
author_association: MEMBER
diff_hunk: @@ -71,7 +71,8 @@
         <jakarta.json-api.version>2.1.3</jakarta.json-api.version>
         <jakarta.json.bind-api.version>3.0.1</jakarta.json.bind-api.version>
         <jakarta.mail-api.version>2.1.3</jakarta.mail-api.version>
-        <jakarta.persistence-api.version>3.1.0</jakarta.persistence-api.version>
+        <!--jakarta.persistence-api.version is located in the main pom -->
path: bom/application/pom.xml
user: login: FroMage
body: Why did you move this?
created_at: 2025-03-28T14:26:02Z
author_association: MEMBER
diff_hunk: @@ -71,7 +71,8 @@
         <jakarta.json-api.version>2.1.3</jakarta.json-api.version>
         <jakarta.json.bind-api.version>3.0.1</jakarta.json.bind-api.version>
         <jakarta.mail-api.version>2.1.3</jakarta.mail-api.version>
-        <jakarta.persistence-api.version>3.1.0</jakarta.persistence-api.version>
+        <!--jakarta.persistence-api.version is located in the main pom -->
path: bom/application/pom.xml
user: login: marko-bekhta
body: I wanted to use the version in the docs (see the `parse-version-jakarta-persistence` execution added in the `docs/pom.xml`) so we wouldn't need to go back to that adoc file and update the JPA version link with the spec update.
created_at: 2025-03-28T14:30:53Z
author_association: MEMBER
diff_hunk: @@ -1569,3 +1569,138 @@ Format mappers *must* have both `@PersistenceUnitExtension` and either `@JsonFor
 
 Having multiple JSON (or XML) format mappers registered for the same persistence unit will result in an exception, because of the ambiguity.
 ====
+
+[[jakarta-data]]
+== Static metamodel and Jakarta Data
+
+Both static metamodel and Jakarta Data capabilities of Hibernate ORM are available to the users
+through the `hibernate-jpamodelgen` annotation processor. Since it is an annotation processor,
+users are required to make an extra step of configuring the annotation processor in their build tool of choice:
+
+[source,xml,role="primary asciidoc-tabs-target-sync-cli asciidoc-tabs-target-sync-maven"]
+.pom.xml
+----
+<plugin>
+    <artifactId>maven-compiler-plugin</artifactId>
+    <configuration>
+        <annotationProcessorPaths>
+            <path>
+                <groupId>org.hibernate.orm</groupId>
+                <artifactId>hibernate-jpamodelgen</artifactId>
+                <!-- Note, no artifact version is required, it's managed by Quarkus.  -->
+            </path>
+            <!-- other processors that may be required by your app -->
+        </annotationProcessorPaths>
+        <!-- Other compiler plugin configuration options -->
+    </configuration>
+</plugin>
+----
+
+[source,gradle,role="secondary asciidoc-tabs-target-sync-gradle"]
+.build.gradle
+----
+// Enforce the version management of your annotation processor dependencies,
+// so that there's no need to define an explicit version of the hibernate-jpamodelgen
+annotationProcessor enforcedPlatform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}")
+annotationProcessor 'org.hibernate.orm:hibernate-jpamodelgen'
+----
+
+=== Static metamodel
+
+The generated static metamodel allows for building queries in a type-safe manner.
+Let's consider having a simple entity:
+
+[source,java]
+----
+@Entity
+public class MyEntity {
+    @Id
+    @GeneratedValue
+    public Integer id;
+
+    @Column(unique = true)
+    public String name;
+}
+----
+
+A query created with the help of static metamodel may look as:
+
+[source,java]
+----
+var builder = session.getCriteriaBuilder();
+var query = builder.createQuery(MyEntity.class);
+var e = query.from(MyEntity_.class_);
+query.where(e.get(MyEntity_.name).equalTo(name));
+session.createQuery(query)....
+----
+
+For a more detailed overview of static metamodel, please refer to the link:{jakarta-persistence-spec-url}#a6072[Jakarta Persistence specification]
+
+=== Jakarta Data
+
+Jakarta Data requires, besides having the `hibernate-jpamodelgen` annotation processor in place, one extra dependency to be added:
+
+[source,xml,role="primary asciidoc-tabs-target-sync-cli asciidoc-tabs-target-sync-maven"]
+.pom.xml
+----
+<dependency>
+    <groupId>jakarta.data</groupId>
+    <artifactId>jakarta.data-api</artifactId>
+</dependency>
+----
+
+[source,gradle,role="secondary asciidoc-tabs-target-sync-gradle"]
+.build.gradle
+----
+implementation 'jakarta.data:jakarta.data-api'
+----
+
+With this dependency, and the annotation processor in place you could simply create your repositories as follows:
+
+[source,java]
+----
+@Repository
+public interface MyRepository {
+
+    @Find
+    Optional<MyEntity> findById(Integer id);
+
+    @Query("select e from MyEntity e where e.name like :name")
+    List<MyEntity> findByName(String name);
+
+    @Insert
path: docs/src/main/asciidoc/hibernate-orm.adoc
user: login: marko-bekhta
body: hey 😃 👋🏻 
thanks for taking a look. yeah .. wasn't sure if we want to use one of those interfaces or just show that we can write our own stuff. But if you think `CRUDRepository` would be better, I'll update it 😃 👍🏻 
created_at: 2025-03-28T14:33:17Z
author_association: MEMBER
diff_hunk: @@ -71,7 +71,8 @@
         <jakarta.json-api.version>2.1.3</jakarta.json-api.version>
         <jakarta.json.bind-api.version>3.0.1</jakarta.json.bind-api.version>
         <jakarta.mail-api.version>2.1.3</jakarta.mail-api.version>
-        <jakarta.persistence-api.version>3.1.0</jakarta.persistence-api.version>
+        <!--jakarta.persistence-api.version is located in the main pom -->
path: bom/application/pom.xml
user: login: FroMage
body: OK, so this probably needs to be cleared by @gsmet as well.
created_at: 2025-03-28T14:43:44Z
author_association: MEMBER
diff_hunk: @@ -1569,3 +1569,138 @@ Format mappers *must* have both `@PersistenceUnitExtension` and either `@JsonFor
 
 Having multiple JSON (or XML) format mappers registered for the same persistence unit will result in an exception, because of the ambiguity.
 ====
+
+[[jakarta-data]]
+== Static metamodel and Jakarta Data
+
+Both static metamodel and Jakarta Data capabilities of Hibernate ORM are available to the users
+through the `hibernate-jpamodelgen` annotation processor. Since it is an annotation processor,
+users are required to make an extra step of configuring the annotation processor in their build tool of choice:
+
+[source,xml,role="primary asciidoc-tabs-target-sync-cli asciidoc-tabs-target-sync-maven"]
+.pom.xml
+----
+<plugin>
+    <artifactId>maven-compiler-plugin</artifactId>
+    <configuration>
+        <annotationProcessorPaths>
+            <path>
+                <groupId>org.hibernate.orm</groupId>
+                <artifactId>hibernate-jpamodelgen</artifactId>
+                <!-- Note, no artifact version is required, it's managed by Quarkus.  -->
+            </path>
+            <!-- other processors that may be required by your app -->
+        </annotationProcessorPaths>
+        <!-- Other compiler plugin configuration options -->
+    </configuration>
+</plugin>
+----
+
+[source,gradle,role="secondary asciidoc-tabs-target-sync-gradle"]
+.build.gradle
+----
+// Enforce the version management of your annotation processor dependencies,
+// so that there's no need to define an explicit version of the hibernate-jpamodelgen
+annotationProcessor enforcedPlatform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}")
+annotationProcessor 'org.hibernate.orm:hibernate-jpamodelgen'
+----
+
+=== Static metamodel
+
+The generated static metamodel allows for building queries in a type-safe manner.
+Let's consider having a simple entity:
+
+[source,java]
+----
+@Entity
+public class MyEntity {
+    @Id
+    @GeneratedValue
+    public Integer id;
+
+    @Column(unique = true)
+    public String name;
+}
+----
+
+A query created with the help of static metamodel may look as:
+
+[source,java]
+----
+var builder = session.getCriteriaBuilder();
+var query = builder.createQuery(MyEntity.class);
+var e = query.from(MyEntity_.class_);
+query.where(e.get(MyEntity_.name).equalTo(name));
+session.createQuery(query)....
+----
+
+For a more detailed overview of static metamodel, please refer to the link:{jakarta-persistence-spec-url}#a6072[Jakarta Persistence specification]
+
+=== Jakarta Data
+
+Jakarta Data requires, besides having the `hibernate-jpamodelgen` annotation processor in place, one extra dependency to be added:
+
+[source,xml,role="primary asciidoc-tabs-target-sync-cli asciidoc-tabs-target-sync-maven"]
+.pom.xml
+----
+<dependency>
+    <groupId>jakarta.data</groupId>
+    <artifactId>jakarta.data-api</artifactId>
+</dependency>
+----
+
+[source,gradle,role="secondary asciidoc-tabs-target-sync-gradle"]
+.build.gradle
+----
+implementation 'jakarta.data:jakarta.data-api'
+----
+
+With this dependency, and the annotation processor in place you could simply create your repositories as follows:
+
+[source,java]
+----
+@Repository
+public interface MyRepository {
+
+    @Find
+    Optional<MyEntity> findById(Integer id);
+
+    @Query("select e from MyEntity e where e.name like :name")
+    List<MyEntity> findByName(String name);
+
+    @Insert
path: docs/src/main/asciidoc/hibernate-orm.adoc
user: login: FroMage
body: I think it would, the methods are just boilerplate here.
created_at: 2025-03-28T14:44:08Z
author_association: MEMBER
diff_hunk: @@ -1569,3 +1569,138 @@ Format mappers *must* have both `@PersistenceUnitExtension` and either `@JsonFor
 
 Having multiple JSON (or XML) format mappers registered for the same persistence unit will result in an exception, because of the ambiguity.
 ====
+
+[[jakarta-data]]
+== Static metamodel and Jakarta Data
+
+Both static metamodel and Jakarta Data capabilities of Hibernate ORM are available to the users
+through the `hibernate-jpamodelgen` annotation processor. Since it is an annotation processor,
+users are required to make an extra step of configuring the annotation processor in their build tool of choice:
+
+[source,xml,role="primary asciidoc-tabs-target-sync-cli asciidoc-tabs-target-sync-maven"]
+.pom.xml
+----
+<plugin>
+    <artifactId>maven-compiler-plugin</artifactId>
+    <configuration>
+        <annotationProcessorPaths>
+            <path>
+                <groupId>org.hibernate.orm</groupId>
+                <artifactId>hibernate-jpamodelgen</artifactId>
+                <!-- Note, no artifact version is required, it's managed by Quarkus.  -->
+            </path>
+            <!-- other processors that may be required by your app -->
+        </annotationProcessorPaths>
+        <!-- Other compiler plugin configuration options -->
+    </configuration>
+</plugin>
+----
+
+[source,gradle,role="secondary asciidoc-tabs-target-sync-gradle"]
+.build.gradle
+----
+// Enforce the version management of your annotation processor dependencies,
+// so that there's no need to define an explicit version of the hibernate-jpamodelgen
+annotationProcessor enforcedPlatform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}")
+annotationProcessor 'org.hibernate.orm:hibernate-jpamodelgen'
+----
+
+=== Static metamodel
+
+The generated static metamodel allows for building queries in a type-safe manner.
+Let's consider having a simple entity:
+
+[source,java]
+----
+@Entity
+public class MyEntity {
+    @Id
+    @GeneratedValue
+    public Integer id;
+
+    @Column(unique = true)
+    public String name;
+}
+----
+
+A query created with the help of static metamodel may look as:
+
+[source,java]
+----
+var builder = session.getCriteriaBuilder();
+var query = builder.createQuery(MyEntity.class);
+var e = query.from(MyEntity_.class_);
+query.where(e.get(MyEntity_.name).equalTo(name));
+session.createQuery(query)....
+----
+
+For a more detailed overview of static metamodel, please refer to the link:{jakarta-persistence-spec-url}#a6072[Jakarta Persistence specification]
+
+=== Jakarta Data
+
+Jakarta Data requires, besides having the `hibernate-jpamodelgen` annotation processor in place, one extra dependency to be added:
+
+[source,xml,role="primary asciidoc-tabs-target-sync-cli asciidoc-tabs-target-sync-maven"]
+.pom.xml
+----
+<dependency>
+    <groupId>jakarta.data</groupId>
+    <artifactId>jakarta.data-api</artifactId>
+</dependency>
+----
+
+[source,gradle,role="secondary asciidoc-tabs-target-sync-gradle"]
+.build.gradle
+----
+implementation 'jakarta.data:jakarta.data-api'
+----
+
+With this dependency, and the annotation processor in place you could simply create your repositories as follows:
+
+[source,java]
+----
+@Repository
+public interface MyRepository {
+
+    @Find
+    Optional<MyEntity> findById(Integer id);
+
+    @Query("select e from MyEntity e where e.name like :name")
+    List<MyEntity> findByName(String name);
+
+    @Insert
path: docs/src/main/asciidoc/hibernate-orm.adoc
user: login: marko-bekhta
body: ok, added some callouts to this example and mentioned available data interfaces there. 
created_at: 2025-03-28T15:14:29Z
author_association: MEMBER
diff_hunk: @@ -71,7 +71,8 @@
         <jakarta.json-api.version>2.1.3</jakarta.json-api.version>
         <jakarta.json.bind-api.version>3.0.1</jakarta.json.bind-api.version>
         <jakarta.mail-api.version>2.1.3</jakarta.mail-api.version>
-        <jakarta.persistence-api.version>3.1.0</jakarta.persistence-api.version>
+        <!--jakarta.persistence-api.version is located in the main pom -->
path: bom/application/pom.xml
user: login: gsmet
body: I think it's all fine. I would maybe say `root pom` though rather than `main pom`.
created_at: 2025-04-02T16:09:31Z
author_association: MEMBER
diff_hunk: @@ -1569,3 +1569,134 @@ Format mappers *must* have both `@PersistenceUnitExtension` and either `@JsonFor
 
 Having multiple JSON (or XML) format mappers registered for the same persistence unit will result in an exception, because of the ambiguity.
 ====
+
+[[jakarta-data]]
+== Static metamodel and Jakarta Data
+
+Both static metamodel and Jakarta Data capabilities of Hibernate ORM are available to the users
path: docs/src/main/asciidoc/hibernate-orm.adoc
user: login: yrodiere
body: ```suggestion
Both static metamodel and Jakarta Data capabilities of Hibernate ORM are available in Quarkus
```
created_at: 2025-04-11T11:23:04Z
author_association: MEMBER
diff_hunk: @@ -1569,3 +1569,134 @@ Format mappers *must* have both `@PersistenceUnitExtension` and either `@JsonFor
 
 Having multiple JSON (or XML) format mappers registered for the same persistence unit will result in an exception, because of the ambiguity.
 ====
+
+[[jakarta-data]]
+== Static metamodel and Jakarta Data
+
+Both static metamodel and Jakarta Data capabilities of Hibernate ORM are available to the users
+through the `hibernate-jpamodelgen` annotation processor. Since it is an annotation processor,
+users are required to make an extra step of configuring the annotation processor in their build tool of choice:
path: docs/src/main/asciidoc/hibernate-orm.adoc
user: login: yrodiere
body: Don't ask me why, or where the rule is written, but in Quarkus documentation we're supposed to address directly to the reader.

```suggestion
you must configure the annotation processor in your build tool:
```
created_at: 2025-04-11T11:26:51Z
author_association: MEMBER
diff_hunk: @@ -1569,3 +1569,134 @@ Format mappers *must* have both `@PersistenceUnitExtension` and either `@JsonFor
 
 Having multiple JSON (or XML) format mappers registered for the same persistence unit will result in an exception, because of the ambiguity.
 ====
+
+[[jakarta-data]]
+== Static metamodel and Jakarta Data
+
+Both static metamodel and Jakarta Data capabilities of Hibernate ORM are available to the users
+through the `hibernate-jpamodelgen` annotation processor. Since it is an annotation processor,
+users are required to make an extra step of configuring the annotation processor in their build tool of choice:
+
+[source,xml,role="primary asciidoc-tabs-target-sync-cli asciidoc-tabs-target-sync-maven"]
+.pom.xml
+----
+<plugin>
+    <artifactId>maven-compiler-plugin</artifactId>
+    <configuration>
+        <annotationProcessorPaths>
+            <path>
+                <groupId>org.hibernate.orm</groupId>
+                <artifactId>hibernate-jpamodelgen</artifactId>
+                <!-- Note, no artifact version is required, it's managed by Quarkus.  -->
+            </path>
+            <!-- other processors that may be required by your app -->
+        </annotationProcessorPaths>
+        <!-- Other compiler plugin configuration options -->
+    </configuration>
+</plugin>
+----
+
+[source,gradle,role="secondary asciidoc-tabs-target-sync-gradle"]
+.build.gradle
+----
+// Enforce the version management of your annotation processor dependencies,
+// so that there's no need to define an explicit version of the hibernate-jpamodelgen
+annotationProcessor enforcedPlatform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}")
+annotationProcessor 'org.hibernate.orm:hibernate-jpamodelgen'
+----
+
+=== Static metamodel
+
+The generated static metamodel allows for building queries in a type-safe manner.
+Let's consider having a simple entity:
+
+[source,java]
+----
+@Entity
+public class MyEntity {
+    @Id
+    @GeneratedValue
+    public Integer id;
+
+    @Column(unique = true)
+    public String name;
+}
+----
+
+A query created with the help of static metamodel may look as:
+
+[source,java]
+----
+var builder = session.getCriteriaBuilder();
+var query = builder.createQuery(MyEntity.class);
+var e = query.from(MyEntity_.class);
+query.where(e.get(MyEntity_.name).equalTo(name));
+session.createQuery(query)....
path: docs/src/main/asciidoc/hibernate-orm.adoc
user: login: yrodiere
body: ```suggestion
var criteria = builder.createQuery(MyEntity.class);
var e = criteria.from(MyEntity_.class);
criteria.where(e.get(MyEntity_.name).equalTo(name));
var query = session.createQuery(criteria);
var result = query.list();
```
created_at: 2025-04-11T11:33:47Z
author_association: MEMBER

PR comments:
user: login: quarkus-bot[bot]
created_at: 2025-03-26T17:02:36Z
body: ---
> :waning_crescent_moon: **_This workflow status is outdated as a new workflow run has been triggered._**
---

# Status for workflow `Quarkus Documentation CI`

This is the status report for running `Quarkus Documentation CI` on commit 3eb68a0ff06e07d868f6873d74a2b152237002d4.



:white_check_mark: The latest workflow run for the pull request has completed successfully.

It should be safe to merge provided you have a look at the other checks in the summary.

> [!WARNING]
> There are other workflow runs running, you probably need to wait for their status before merging.

<!-- Build-Reporter/build-scans-check-run -->


<!-- Build-Reporter/msg-id:workflow-run-status-hidden:Quarkus Documentation CI -->
<!-- Build-Reporter/workflow-run-id:14088488089 -->
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-26T17:06:22Z
body: 🙈 The PR is closed and the preview is expired.


<!-- Preview status comment marker -->
author_association: NONE
user: login: quarkus-bot[bot]
created_at: 2025-03-26T20:00:15Z
body: ---
> :waning_crescent_moon: **_This workflow status is outdated as a new workflow run has been triggered._**
---

# Status for workflow `Quarkus CI`

This is the status report for running `Quarkus CI` on commit 3eb68a0ff06e07d868f6873d74a2b152237002d4.



:white_check_mark: The latest workflow run for the pull request has completed successfully.

It should be safe to merge provided you have a look at the other checks in the summary.

You can consult the [Develocity build scans](https://github.com/quarkusio/quarkus/runs/39471876553).


<!-- Build-Reporter/msg-id:workflow-run-status-hidden:Quarkus CI -->
<!-- Build-Reporter/workflow-run-id:14088488124 -->
author_association: NONE
user: login: quarkus-bot[bot]
created_at: 2025-03-27T15:00:29Z
body: ---
> :waning_crescent_moon: **_This workflow status is outdated as a new workflow run has been triggered._**
---

# Status for workflow `Quarkus Documentation CI`

This is the status report for running `Quarkus Documentation CI` on commit b4493cab9fe4221f9ffcabdb729dc6ec4951d4f8.



:white_check_mark: The latest workflow run for the pull request has completed successfully.

It should be safe to merge provided you have a look at the other checks in the summary.

> [!WARNING]
> There are other workflow runs running, you probably need to wait for their status before merging.

<!-- Build-Reporter/build-scans-check-run -->


<!-- Build-Reporter/msg-id:workflow-run-status-hidden:Quarkus Documentation CI -->
<!-- Build-Reporter/workflow-run-id:14109168041 -->
author_association: NONE
user: login: quarkus-bot[bot]
created_at: 2025-03-27T18:05:14Z
body: ---
> :waning_crescent_moon: **_This workflow status is outdated as a new workflow run has been triggered._**
---

# Status for workflow `Quarkus CI`

This is the status report for running `Quarkus CI` on commit b4493cab9fe4221f9ffcabdb729dc6ec4951d4f8.



## Failing Jobs



| Status | Name | Step | Failures | Logs | Raw logs | Build scan |
| :-:  | --  | --  | :-:  | :-:  | :-:  | :-:  |
| :heavy_check_mark: | JVM Integration Tests - JDK 17 |  |  | [Logs](https://github.com/quarkusio/quarkus/actions/runs/14109168016/job/39523963030) | [Raw logs](https://github.com/quarkusio/quarkus/commit/b4493cab9fe4221f9ffcabdb729dc6ec4951d4f8/checks/39523963030/logs) | [:mag:](https://ge.quarkus.io/s/k22ui4zduilxq) |
| ✖ | JVM Integration Tests - JDK 17 Windows | `Build` | [Failures](#user-content-test-failures-job-39523965375) | [Logs](https://github.com/quarkusio/quarkus/actions/runs/14109168016/job/39523965375) | [Raw logs](https://github.com/quarkusio/quarkus/commit/b4493cab9fe4221f9ffcabdb729dc6ec4951d4f8/checks/39523965375/logs) | [:mag:](https://ge.quarkus.io/s/jg7qvx6rljjbo) |
| ✖ | JVM Integration Tests - JDK 21 | `Build` | [Failures](#user-content-test-failures-job-39523964417) | [Logs](https://github.com/quarkusio/quarkus/actions/runs/14109168016/job/39523964417) | [Raw logs](https://github.com/quarkusio/quarkus/commit/b4493cab9fe4221f9ffcabdb729dc6ec4951d4f8/checks/39523964417/logs) | [:mag:](https://ge.quarkus.io/s/gt7kcsndjrdcu) |

Full information is available in the [Build summary check run](https://github.com/quarkusio/quarkus/runs/39538419055).
You can consult the [Develocity build scans](https://github.com/quarkusio/quarkus/runs/39538341881).


## Failures

### :gear: JVM Integration Tests - JDK 17 Windows <a href="#user-content-test-failures-job-39523965375" id="test-failures-job-39523965375">#</a>

```diff
- Failing: integration-tests/oidc-dev-services 

```

#### :package: integration-tests/oidc-dev-services

<p>✖ <code>Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:3.5.2:test (default-test) on project quarkus-integration-test-oidc-dev-services: 

See D:\a\quarkus\quarkus\integration-tests\oidc-dev-services\target\surefire-reports for the individual test results.
See dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream.
There was an error in the forked process</code></p>


---

### :gear: JVM Integration Tests - JDK 21 <a href="#user-content-test-failures-job-39523964417" id="test-failures-job-39523964417">#</a>

```diff
- Failing: integration-tests/observability-lgtm 

```

#### :package: integration-tests/observability-lgtm

<p>✖ <code>io.quarkus.observability.test.LgtmReloadTest.testReload</code> - <a href="https://ge.quarkus.io/scans/tests?tests.container=io.quarkus.observability.test.LgtmReloadTest&tests.test=testReload">History</a> - <a href="https://github.com/quarkusio/quarkus/runs/39538419055#user-content-test-failure-io.quarkus.observability.test.lgtmreloadtest-1">More details</a> - <a href="https://github.com/quarkusio/quarkus/blob/b4493cab9fe4221f9ffcabdb729dc6ec4951d4f8/integration-tests/observability-lgtm/src/test/java/io/quarkus/observability/test/LgtmReloadTest.java">Source on GitHub</a></p>

<details>

```
java.io.UncheckedIOException: java.io.IOException: parsing HTTP/1.1 status line, receiving [&amp#0;&amp#0;&amp#6;&amp#4;&amp#0;&amp#0;&amp#0;&amp#0;&amp#0;&amp#0;&amp#5;&amp#0;&amp#0;@&amp#0;], parser state [STATUS_LINE]
	at io.quarkus.observability.test.utils.GrafanaClient.handle(GrafanaClient.java:55)
	at io.quarkus.observability.test.utils.GrafanaClient.user(GrafanaClient.java:81)
	at org.awaitility.core.AbstractHamcrestCondition.lambda$new$0(AbstractHamcrestCondition.java:48)
	at org.awaitility.core.ConditionAwaiter$ConditionPoller.call(ConditionAwaiter.java:248)
	at org.awaitility.core.ConditionAwaiter$ConditionPoller.call(ConditionAwaiter.java:235)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
```

</details>



---

## Flaky tests - <a href="https://ge.quarkus.io/scans/tests">Develocity</a>

### :gear: JVM Tests - JDK 17

#### :package: extensions/hibernate-reactive/deployment

<p>✖ <code>io.quarkus.hibernate.reactive.publicfields.PublicFieldAccessInheritanceTest.testFieldAccess(UniAsserter)</code> - <a href="https://ge.quarkus.io/scans/tests?tests.container=io.quarkus.hibernate.reactive.publicfields.PublicFieldAccessInheritanceTest&tests.test=testFieldAccess(UniAsserter)">History</a></p>

- `
Expecting actual not to be null` - `java.lang.AssertionError`

<details>

```
java.lang.AssertionError: 

Expecting actual not to be null
	at io.quarkus.hibernate.reactive.publicfields.PublicFieldAccessInheritanceTest$FieldAccessEnhancedDelegate$2.assertValue(PublicFieldAccessInheritanceTest.java:127)
	at io.quarkus.test.vertx.DefaultUniAsserter$1.accept(DefaultUniAsserter.java:38)
	at io.smallrye.context.impl.wrappers.SlowContextualConsumer.accept(SlowContextualConsumer.java:21)
	at io.smallrye.mutiny.operators.uni.UniOnItemConsume$UniOnItemComsumeProcessor.invokeEventHandler(UniOnItemConsume.java:77)
	at io.smallrye.mutiny.operators.uni.UniOnItemConsume$UniOnItemComsumeProcessor.onItem(UniOnItemConsume.java:42)
```

</details>



---

### :gear: JVM Tests - JDK 21

#### :package: extensions/panache/hibernate-reactive-rest-data-panache/deployment

<p>✖ <code>io.quarkus.hibernate.reactive.rest.data.panache.deployment.repository.PanacheRepositoryResourcePutMethodTest.shouldUpdateComplexObject</code> - <a href="https://ge.quarkus.io/scans/tests?tests.container=io.quarkus.hibernate.reactive.rest.data.panache.deployment.repository.PanacheRepositoryResourcePutMethodTest&tests.test=shouldUpdateComplexObject">History</a></p>

- `1 expectation failed.
JSON path name doesn't match.
Expected: is "updated collection"
  Actual: empty collection` - `java.lang.AssertionError`

<details>

```
java.lang.AssertionError: 
1 expectation failed.
JSON path name doesn't match.
Expected: is "updated collection"
  Actual: empty collection

	at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:502)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:486)
```

</details>



<!-- Build-Reporter/msg-id:workflow-run-status-hidden:Quarkus CI -->
<!-- Build-Reporter/workflow-run-id:14109168016 -->
author_association: NONE
user: login: quarkus-bot[bot]
created_at: 2025-03-28T15:39:30Z
body: ---
> :waning_crescent_moon: **_This workflow status is outdated as a new workflow run has been triggered._**
---

# Status for workflow `Quarkus Documentation CI`

This is the status report for running `Quarkus Documentation CI` on commit e2690a8a30a65ffd317f7f7e755c243ad10627ec.



:white_check_mark: The latest workflow run for the pull request has completed successfully.

It should be safe to merge provided you have a look at the other checks in the summary.

> [!WARNING]
> There are other workflow runs running, you probably need to wait for their status before merging.

<!-- Build-Reporter/build-scans-check-run -->


<!-- Build-Reporter/msg-id:workflow-run-status-hidden:Quarkus Documentation CI -->
<!-- Build-Reporter/workflow-run-id:14132088900 -->
author_association: NONE
user: login: quarkus-bot[bot]
created_at: 2025-03-28T18:47:30Z
body: ---
> :waning_crescent_moon: **_This workflow status is outdated as a new workflow run has been triggered._**
---

# Status for workflow `Quarkus CI`

This is the status report for running `Quarkus CI` on commit e2690a8a30a65ffd317f7f7e755c243ad10627ec.



:white_check_mark: The latest workflow run for the pull request has completed successfully.

It should be safe to merge provided you have a look at the other checks in the summary.

You can consult the [Develocity build scans](https://github.com/quarkusio/quarkus/runs/39607149346).


---

## Flaky tests - <a href="https://ge.quarkus.io/scans/tests">Develocity</a>

### :gear: JVM Tests - JDK 17

#### :package: extensions/smallrye-reactive-messaging/deployment

<p>✖ <code>io.quarkus.smallrye.reactivemessaging.hotreload.ConnectorChangeTest.testUpdatingConnector</code> - <a href="https://ge.quarkus.io/scans/tests?tests.container=io.quarkus.smallrye.reactivemessaging.hotreload.ConnectorChangeTest&tests.test=testUpdatingConnector">History</a></p>

- `
Expecting actual:
  ["-4","-5","-6","-7","-8","-9","-10","-11"]
to start with:
  ["-3", "-4", "-5", "-6"]` - `java.lang.AssertionError`

<details>

```
java.lang.AssertionError: 

Expecting actual:
  ["-4","-5","-6","-7","-8","-9","-10","-11"]
to start with:
  ["-3", "-4", "-5", "-6"]

	at io.quarkus.smallrye.reactivemessaging.hotreload.ConnectorChangeTest.testUpdatingConnector(ConnectorChangeTest.java:36)
```

</details>



---

### :gear: JVM Tests - JDK 21

#### :package: extensions/smallrye-reactive-messaging/deployment

<p>✖ <code>io.quarkus.smallrye.reactivemessaging.hotreload.ConnectorChangeTest.testUpdatingConnector</code> - <a href="https://ge.quarkus.io/scans/tests?tests.container=io.quarkus.smallrye.reactivemessaging.hotreload.ConnectorChangeTest&tests.test=testUpdatingConnector">History</a></p>

- `
Expecting actual:
  ["-4","-5","-6","-7","-8","-9","-10","-11"]
to start with:
  ["-3", "-4", "-5", "-6"]` - `java.lang.AssertionError`

<details>

```
java.lang.AssertionError: 

Expecting actual:
  ["-4","-5","-6","-7","-8","-9","-10","-11"]
to start with:
  ["-3", "-4", "-5", "-6"]

	at io.quarkus.smallrye.reactivemessaging.hotreload.ConnectorChangeTest.testUpdatingConnector(ConnectorChangeTest.java:36)
```

</details>



---

### :gear: JVM Integration Tests - JDK 21

#### :package: integration-tests/grpc-hibernate

<p>✖ <code>com.example.grpc.hibernate.VertxBlockingRawTest.shouldAdd</code> - <a href="https://ge.quarkus.io/scans/tests?tests.container=com.example.grpc.hibernate.VertxBlockingRawTest&tests.test=shouldAdd">History</a></p>

- `Condition with Lambda expression in com.example.grpc.hibernate.BlockingRawTestBase was not fulfilled within 30 seconds.` - `org.awaitility.core.ConditionTimeoutException`

<details>

```
org.awaitility.core.ConditionTimeoutException: Condition with Lambda expression in com.example.grpc.hibernate.BlockingRawTestBase was not fulfilled within 30 seconds.
	at org.awaitility.core.ConditionAwaiter.await(ConditionAwaiter.java:167)
	at org.awaitility.core.CallableCondition.await(CallableCondition.java:78)
	at org.awaitility.core.CallableCondition.await(CallableCondition.java:26)
	at org.awaitility.core.ConditionFactory.until(ConditionFactory.java:1160)
	at org.awaitility.core.ConditionFactory.until(ConditionFactory.java:1129)
	at com.example.grpc.hibernate.BlockingRawTestBase.shouldAdd(BlockingRawTestBase.java:59)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
```

</details>



<!-- Build-Reporter/msg-id:workflow-run-status-hidden:Quarkus CI -->
<!-- Build-Reporter/workflow-run-id:14132088903 -->
author_association: NONE
user: login: quarkus-bot[bot]
created_at: 2025-04-02T16:43:34Z
body: ---
> :waning_crescent_moon: **_This workflow status is outdated as a new workflow run has been triggered._**
---

# Status for workflow `Quarkus Documentation CI`

This is the status report for running `Quarkus Documentation CI` on commit 0f15ddcc2e14d6fefdb374e9033a5b2b52633467.



:white_check_mark: The latest workflow run for the pull request has completed successfully.

It should be safe to merge provided you have a look at the other checks in the summary.

> [!WARNING]
> There are other workflow runs running, you probably need to wait for their status before merging.

<!-- Build-Reporter/build-scans-check-run -->


<!-- Build-Reporter/msg-id:workflow-run-status-hidden:Quarkus Documentation CI -->
<!-- Build-Reporter/workflow-run-id:14224531886 -->
author_association: NONE
user: login: quarkus-bot[bot]
created_at: 2025-04-02T19:51:39Z
body: ---
> :waning_crescent_moon: **_This workflow status is outdated as a new workflow run has been triggered._**
---

# Status for workflow `Quarkus CI`

This is the status report for running `Quarkus CI` on commit 0f15ddcc2e14d6fefdb374e9033a5b2b52633467.



:white_check_mark: The latest workflow run for the pull request has completed successfully.

It should be safe to merge provided you have a look at the other checks in the summary.

You can consult the [Develocity build scans](https://github.com/quarkusio/quarkus/runs/39873006566).


---

## Flaky tests - <a href="https://ge.quarkus.io/scans/tests">Develocity</a>

### :gear: JVM Tests - JDK 17

#### :package: extensions/smallrye-reactive-messaging/deployment

<p>✖ <code>io.quarkus.smallrye.reactivemessaging.hotreload.ConnectorChangeTest.testUpdatingConnector</code> - <a href="https://ge.quarkus.io/scans/tests?tests.container=io.quarkus.smallrye.reactivemessaging.hotreload.ConnectorChangeTest&tests.test=testUpdatingConnector">History</a></p>

- `
Expecting actual:
  ["-4","-5","-6","-7","-8","-9","-10","-11"]
to start with:
  ["-3", "-4", "-5", "-6"]` - `java.lang.AssertionError`

<details>

```
java.lang.AssertionError: 

Expecting actual:
  ["-4","-5","-6","-7","-8","-9","-10","-11"]
to start with:
  ["-3", "-4", "-5", "-6"]

	at io.quarkus.smallrye.reactivemessaging.hotreload.ConnectorChangeTest.testUpdatingConnector(ConnectorChangeTest.java:36)
```

</details>



---

### :gear: Gradle Tests - JDK 17 Windows

#### :package: integration-tests/gradle

<p>✖ <code>io.quarkus.gradle.devmode.KotlinProjectWithCompilerArgsDevModeTest.main</code> - <a href="https://ge.quarkus.io/scans/tests?tests.container=io.quarkus.gradle.devmode.KotlinProjectWithCompilerArgsDevModeTest&tests.test=main">History</a></p>

- `Condition with Lambda expression in io.quarkus.test.devmode.util.DevModeClient was not fulfilled within 2 minutes.` - `org.awaitility.core.ConditionTimeoutException`

<details>

```
org.awaitility.core.ConditionTimeoutException: Condition with Lambda expression in io.quarkus.test.devmode.util.DevModeClient was not fulfilled within 2 minutes.
	at app//org.awaitility.core.ConditionAwaiter.await(ConditionAwaiter.java:167)
	at app//org.awaitility.core.CallableCondition.await(CallableCondition.java:78)
	at app//org.awaitility.core.CallableCondition.await(CallableCondition.java:26)
	at app//org.awaitility.core.ConditionFactory.until(ConditionFactory.java:1160)
	at app//org.awaitility.core.ConditionFactory.until(ConditionFactory.java:1129)
	at app//io.quarkus.test.devmode.util.DevModeClient.getHttpResponse(DevModeClient.java:164)
	at app//io.quarkus.gradle.devmode.QuarkusDevGradleTestBase.getHttpResponse(QuarkusDevGradleTestBase.java:165)
```

</details>

- `Condition with Lambda expression in io.quarkus.test.devmode.util.DevModeClient was not fulfilled within 2 minutes.` - `org.awaitility.core.ConditionTimeoutException`

<details>

```
org.awaitility.core.ConditionTimeoutException: Condition with Lambda expression in io.quarkus.test.devmode.util.DevModeClient was not fulfilled within 2 minutes.
	at app//org.awaitility.core.ConditionAwaiter.await(ConditionAwaiter.java:167)
	at app//org.awaitility.core.CallableCondition.await(CallableCondition.java:78)
	at app//org.awaitility.core.CallableCondition.await(CallableCondition.java:26)
	at app//org.awaitility.core.ConditionFactory.until(ConditionFactory.java:1160)
	at app//org.awaitility.core.ConditionFactory.until(ConditionFactory.java:1129)
	at app//io.quarkus.test.devmode.util.DevModeClient.getHttpResponse(DevModeClient.java:164)
	at app//io.quarkus.gradle.devmode.QuarkusDevGradleTestBase.getHttpResponse(QuarkusDevGradleTestBase.java:165)
```

</details>



---

### :gear: JVM Integration Tests - JDK 21

#### :package: integration-tests/opentelemetry-grpc-only

<p>✖ <code>io.quarkus.it.opentelemetry.grpc.HelloGrpcClientTest.testHello</code> - <a href="https://ge.quarkus.io/scans/tests?tests.container=io.quarkus.it.opentelemetry.grpc.HelloGrpcClientTest&tests.test=testHello">History</a></p>

- `java.lang.RuntimeException: Failed to start quarkus` - `java.lang.RuntimeException`

<details>

```
java.lang.RuntimeException: java.lang.RuntimeException: Failed to start quarkus
	at io.quarkus.test.junit.QuarkusTestExtension.throwBootFailureException(QuarkusTestExtension.java:672)
	at io.quarkus.test.junit.QuarkusTestExtension.interceptTestClassConstructor(QuarkusTestExtension.java:770)
	at java.base/java.util.Optional.orElseGet(Optional.java:364)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
Caused by: java.lang.RuntimeException: Failed to start quarkus
	at io.quarkus.runner.ApplicationImpl.doStart(Unknown Source)
```

</details>



<!-- Build-Reporter/msg-id:workflow-run-status-hidden:Quarkus CI -->
<!-- Build-Reporter/workflow-run-id:14224531898 -->
author_association: NONE
user: login: marko-bekhta
created_at: 2025-04-11T12:13:29Z
body: thanks 😃 
rebased and applied the changes.
author_association: MEMBER
user: login: quarkus-bot[bot]
created_at: 2025-04-11T12:41:36Z
body: # Status for workflow `Quarkus Documentation CI`

This is the status report for running `Quarkus Documentation CI` on commit cc55044bd8295d9a479480681c63675c0422a262.



:white_check_mark: The latest workflow run for the pull request has completed successfully.

It should be safe to merge provided you have a look at the other checks in the summary.

> [!WARNING]
> There are other workflow runs running, you probably need to wait for their status before merging.

<!-- Build-Reporter/build-scans-check-run -->


<!-- Build-Reporter/msg-id:workflow-run-status-active:Quarkus Documentation CI -->
<!-- Build-Reporter/workflow-run-id:14402858906 -->
author_association: NONE
user: login: quarkus-bot[bot]
created_at: 2025-04-11T15:53:23Z
body: # Status for workflow `Quarkus CI`

This is the status report for running `Quarkus CI` on commit cc55044bd8295d9a479480681c63675c0422a262.



:white_check_mark: The latest workflow run for the pull request has completed successfully.

It should be safe to merge provided you have a look at the other checks in the summary.

You can consult the [Develocity build scans](https://github.com/quarkusio/quarkus/runs/40406070980).


<!-- Build-Reporter/msg-id:workflow-run-status-active:Quarkus CI -->
<!-- Build-Reporter/workflow-run-id:14402858913 -->
author_association: NONE