HHH-16973 document optional 'from' clause and use it in @HQL examples

This commit is contained in:
Gavin King 2023-08-10 20:18:08 +02:00
parent 5b2d347b6f
commit 09dd5daa73
4 changed files with 29 additions and 11 deletions

View File

@ -146,7 +146,7 @@ Let's just stick it on the `Book` class:
----
@CheckHQL // validate the query at compile time
@NamedQuery(name = "#findByTitleAndType",
query = "select book from Book book where book.title like :titlen and book.type = :type")
query = "select book from Book book where book.title like :titlen and book.type = :type")
@Entity
public class Book { ... }
----
@ -189,7 +189,7 @@ We'll need a place to put this method, and since our `Book` entity isn't an abst
[source,java]
----
interface Queries {
@HQL("from Book where title like :title and type = :type")
@HQL("where title like :title and type = :type")
List<Book> findBooksByTitleAndType(String title, String type);
}
----
@ -216,7 +216,7 @@ public abstract class Queries_ {
}
static final String FIND_BOOKS_BY_TITLE_AND_TYPE_String_Type =
"from Book where title like :title and type = :type";
"where title like :title and type = :type";
}
@ -229,7 +229,7 @@ If we want to explicitly specify the name and type of this parameter, we may dec
[source,java]
----
interface Queries {
@HQL("from Book where title like :title and type = :type")
@HQL("where title like :title and type = :type")
List<Book> findBooksByTitleAndType(StatelessSession session, String title, String type);
}
----
@ -277,7 +277,7 @@ We may call this method anything we like:
interface Queries {
EntityManager entityManager();
@HQL("from Book where title like :title and type = :type")
@HQL("where title like :title and type = :type")
List<Book> findBooksByTitleAndType(String title, String type);
}
----
@ -316,7 +316,7 @@ public class Queries_ implements Queries {
}
static final String FIND_BOOKS_BY_TITLE_AND_TYPE_String_Type =
"from Book where title like :title and type = :type";
"where title like :title and type = :type";
}
----
@ -342,7 +342,7 @@ interface Queries {
// handwritten method replacing previous generated implementation
default List<Book> findBooksByTitleAndType(String title, String type) {
entityManager()
.createQuery("from Book where title like :title and type = :type", Book.class)
.createQuery("where title like :title and type = :type", Book.class)
.setParameter("title", title)
.setParameter("type", type)
.setFlushMode(COMMIT)
@ -558,7 +558,7 @@ It might return a single `Book`.
[source,java]
----
@HQL("from Book where isbn = :isbn")
@HQL("where isbn = :isbn")
Book findBookByIsbn(String isbn);
----
@ -592,7 +592,7 @@ A query method might even return `TypedQuery` or `SelectionQuery`:
[source,java]
----
@HQL("from Book where title like :title")
@HQL("where title like :title")
SelectionQuery<Book> findBooksByTitle(String title);
----

View File

@ -554,7 +554,7 @@ Suppose we simplify `Queries` to just the following:
[source,java]
----
interface Queries {
@HQL("from Book where title like :title order by title")
@HQL("where title like :title order by title")
List<Book> findBooksByTitleWithPagination(String title, Page page);
}
----

View File

@ -489,7 +489,7 @@ But when there's no explicit `select` clause, the select list is implied by the
List<Book> books =
session.createQuery("from Book join authors", Book.class)
.getResultList();
for (Person person: persons) {
for (Book book: books) {
...
}
----
@ -546,6 +546,23 @@ HQL makes it very easy to fetch all the data we need in a single trip to the dat
Typically, it's much worse to fetch exactly the data we need, but in many round trips to the database server, than it is to fetch just a bit more data than what we're going to need, all a single SQL query.
====
When there's no explicit `select` clause, a further abbreviation is sometimes possible.
[TIP]
====
When the result type of a `select` query is an entity type, and we specify the type explicitly by passing the entity class to `createQuery()` or `createSelectionQuery()`, we're sometimes allowed to omit the `from` clause, for example:
[source, java]
[%unbreakable]
----
// explicit result type Book, so 'from Book' is inferred
List<Book> books =
session.createQuery("where title like :title", Book.class)
.setParameter("title", title)
.getResultList();
----
====
[[returning-to-java]]
=== Representing result sets in Java

View File

@ -10,6 +10,7 @@ orderedQuery
query
: selectClause fromClause? whereClause? (groupByClause havingClause?)?
| fromClause whereClause? (groupByClause havingClause?)? selectClause?
| whereClause
queryOrder
: orderByClause limitClause? offsetClause? fetchClause?