Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 10 additions & 10 deletions documentation/src/main/asciidoc/introduction/Introduction.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -498,8 +498,8 @@ Let's hit the code with our favorite thing, the Extract Method refactoring. We o

[source,java]
----
static List<Book> findBooksByTitleWithPagination(Session session,
String titlePattern, Page page) {
static List<Book> findBooksTitled(Session session,
String titlePattern, Page page) {
return session.createSelectionQuery("from Book where title like ?1 order by title", Book.class)
.setParameter(1, titlePattern)
.setPage(page)
Expand All @@ -522,9 +522,9 @@ We need a place to put the annotation, so let's move our query method to a new c
query = "from Book where title like :title order by title")
class Queries {

static List<Book> findBooksByTitleWithPagination(Session session,
String titlePattern, Page page) {
return session.createNamedQuery(Queries_._findBooksByTitle_) //type safe reference to the named query
static List<Book> findBooksTitled(Session session,
String titlePattern, Page page) {
return session.createQuery(Queries_._findBooksByTitle_) //type safe reference to the named query
.setParameter("title", titlePattern)
.setPage(page)
.getResultList();
Expand All @@ -549,7 +549,7 @@ Whatever the case, the code which orchestrates a unit of work usually just calls
@Path("books/{titlePattern}")
public List<Book> findBooks(String titlePattern) {
var books = sessionFactory.fromTransaction(session ->
Queries.findBooksByTitleWithPagination(session, titlePattern,
Queries.findBooksTitled(session, titlePattern,
Page.page(RESULTS_PER_PAGE, page)));
return books.isEmpty() ? Response.status(404).build() : books;
}
Expand All @@ -569,7 +569,7 @@ Suppose we simplify `Queries` to just the following:
----
interface Queries {
@HQL("where title like :title order by title")
List<Book> findBooksByTitleWithPagination(String title, Page page);
List<Book> findBooksTitled(String title, Page page);
}
----

Expand All @@ -582,7 +582,7 @@ We can call it just like we were previously calling our handwritten version:
@Path("books/{titlePattern}")
public List<Book> findBooks(String titlePattern) {
var books = sessionFactory.fromTransaction(session ->
Queries_.findBooksByTitleWithPagination(session, titlePattern,
Queries_.findBooksTitled(session, titlePattern,
Page.page(RESULTS_PER_PAGE, page)));
return books.isEmpty() ? Response.status(404).build() : books;
}
Expand All @@ -602,7 +602,7 @@ interface Queries {
EntityManager entityManager();

@HQL("where title like :title order by title")
List<Book> findBooksByTitleWithPagination(String title, Page page);
List<Book> findBooksTitled(String title, Page page);
}
----

Expand All @@ -616,7 +616,7 @@ The `Queries` interface is now considered a _repository_, and we may use CDI to
@Path("books/{titlePattern}")
@Transactional
public List<Book> findBooks(String titlePattern) {
var books = queries.findBooksByTitleWithPagination(session, titlePattern,
var books = queries.findBooksTitled(session, titlePattern,
Page.page(RESULTS_PER_PAGE, page));
return books.isEmpty() ? Response.status(404).build() : books;
}
Expand Down
4 changes: 2 additions & 2 deletions documentation/src/main/asciidoc/introduction/Processor.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -572,7 +572,7 @@ This lets us declare which associations of `Book` should be pre-fetched by annot
// ----
// interface Queries {
// @HQL("from Book where title like :title order by title offset :start fetch first :max rows only")
// List<Book> findBooksByTitleWithPagination(String title, int max, int start);
// List<Book> findBooksTitled(String title, int max, int start);
// }
// ----
//
Expand All @@ -583,7 +583,7 @@ This lets us declare which associations of `Book` should be pre-fetched by annot
// [source,java]
// ----
// List<Book> books =
// Queries_.findBooksByTitleWithPagination(entityManager, titlePattern,
// Queries_.findBooksTitled(entityManager, titlePattern,
// RESULTS_PER_PAGE, page*RESULTS_PER_PAGE);
// ----

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
/*
* SPDX-License-Identifier: LGPL-2.1-or-later
* Copyright Red Hat Inc. and Hibernate Authors
*/
package org.hibernate.processor.test.namedquery;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.NamedQuery;

@NamedQuery(name = "#things",
query = "from Thing where name like :name")
@Entity
public class Thing {
@Id @GeneratedValue long id;
String name;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
/*
* SPDX-License-Identifier: LGPL-2.1-or-later
* Copyright Red Hat Inc. and Hibernate Authors
*/
package org.hibernate.processor.test.namedquery;

import jakarta.persistence.EntityManager;
import org.hibernate.processor.test.util.CompilationTest;
import org.hibernate.processor.test.util.WithClasses;
import org.junit.Test;

import static org.hibernate.processor.test.util.TestUtil.assertMetamodelClassGeneratedFor;
import static org.hibernate.processor.test.util.TestUtil.assertPresenceOfFieldInMetamodelFor;
import static org.hibernate.processor.test.util.TestUtil.assertPresenceOfMethodInMetamodelFor;
import static org.hibernate.processor.test.util.TestUtil.getMetaModelSourceAsString;

public class ThingTest extends CompilationTest {
@Test @WithClasses( Thing.class )
public void test() {
System.out.println( getMetaModelSourceAsString( Thing.class) );
System.out.println( getMetaModelSourceAsString( Thing.class, true) );
assertMetamodelClassGeneratedFor(Thing.class);
assertMetamodelClassGeneratedFor(Thing.class, true);
assertPresenceOfMethodInMetamodelFor( Thing.class, "things", EntityManager.class, String.class );
assertPresenceOfFieldInMetamodelFor( Thing.class, "__things_" );
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,10 @@
import java.util.List;

import static java.lang.Character.isJavaIdentifierStart;
import static org.hibernate.processor.util.Constants.ENTITY_GRAPH;
import static org.hibernate.processor.util.Constants.JAVA_OBJECT;
import static org.hibernate.processor.util.Constants.NAMED_QUERY;
import static org.hibernate.processor.util.Constants.TYPED_QUERY_REFERENCE;
import static org.hibernate.processor.util.TypeUtils.containsAnnotation;
import static org.hibernate.processor.util.TypeUtils.getAnnotationMirror;
import static org.hibernate.processor.util.TypeUtils.getAnnotationValue;
Expand Down Expand Up @@ -107,9 +109,11 @@ private void handleNamedQuery(AnnotationMirror mirror, boolean checkHql) {
ProcessorSessionFactory.create( context.getProcessingEnvironment(),
context.getEntityNameMappings(), context.getEnumTypesByValue() )
);
if ( statement instanceof SqmSelectStatement<?> selectStatement ) {
if ( !isJakartaDataStyle()
&& statement instanceof SqmSelectStatement<?> selectStatement ) {
if ( isQueryMethodName( name ) ) {
putMember( name,
// TODO: respect @NamedQuery(resultClass)
new NamedQueryMethod(
this,
selectStatement,
Expand All @@ -121,13 +125,12 @@ private void handleNamedQuery(AnnotationMirror mirror, boolean checkHql) {
)
);
}
if ( !isJakartaDataStyle()
&& getAnnotationValue( mirror, "resultClass" ) == null ) {
if ( getAnnotationValue( mirror, "resultClass" ) == null ) {
final String resultType = resultType( selectStatement );
if ( resultType != null ) {
putMember( "QUERY_" + name,
new TypedMetaAttribute( this, name, "QUERY_", resultType,
"jakarta.persistence.TypedQueryReference", hql ) );
TYPED_QUERY_REFERENCE, hql ) );
}
}
}
Expand Down Expand Up @@ -207,11 +210,11 @@ private NameMetaAttribute auxiliaryMember(AnnotationMirror mirror, String prefix
// and then we will replace this TypedMetaAttribute
return new TypedMetaAttribute( this, name, prefix,
resultClass == null ? JAVA_OBJECT : resultClass.getValue().toString(),
"jakarta.persistence.TypedQueryReference", null );
TYPED_QUERY_REFERENCE, null );
}
else if ( "GRAPH_".equals(prefix) ) {
return new TypedMetaAttribute( this, name, prefix, getQualifiedName(),
"jakarta.persistence.EntityGraph", null );
ENTITY_GRAPH, null );
}
else {
return new NameMetaAttribute( this, name, prefix);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@ public final class Constants {
public static final String NAMED_ENTITY_GRAPH = "jakarta.persistence.NamedEntityGraph";
public static final String NAMED_ENTITY_GRAPHS = "jakarta.persistence.NamedEntityGraphs";

public static final String TYPED_QUERY_REFERENCE = "jakarta.persistence.TypedQueryReference";
public static final String ENTITY_GRAPH = "jakarta.persistence.EntityGraph";

public static final String HIB_NAMED_QUERY = "org.hibernate.annotations.NamedQuery";
public static final String HIB_NAMED_QUERIES = "org.hibernate.annotations.NamedQueries";
public static final String HIB_NAMED_NATIVE_QUERY = "org.hibernate.annotations.NamedNativeQuery";
Expand Down
Loading