type=page
status=published
title=Querying Entities
next=persistence-intro006.html
prev=persistence-intro004.html
~~~~~~
Querying Entities
=================

[[GJISE]]

[[querying-entities]]
Querying Entities
-----------------

The Java Persistence API provides the following methods for querying
entities.

* The Java Persistence query language (JPQL) is a simple, string-based
language similar to SQL used to query entities and their relationships.
See link:persistence-querylanguage.html#BNBTG[Chapter 42, "The Java
Persistence Query Language"] for more information.
* The Criteria API is used to create typesafe queries using Java
programming language APIs to query for entities and their relationships.
See link:persistence-criteria.html#GJITV[Chapter 43, "Using the Criteria
API to Create Queries"] for more information.

Both JPQL and the Criteria API have advantages and disadvantages.

Just a few lines long, JPQL queries are typically more concise and more
readable than Criteria queries. Developers familiar with SQL will find
it easy to learn the syntax of JPQL. JPQL named queries can be defined
in the entity class using a Java programming language annotation or in
the application's deployment descriptor. JPQL queries are not typesafe,
however, and require a cast when retrieving the query result from the
entity manager. This means that type-casting errors may not be caught at
compile time. JPQL queries don't support open-ended parameters.

Criteria queries allow you to define the query in the business tier of
the application. Although this is also possible using JPQL dynamic
queries, Criteria queries provide better performance because JPQL
dynamic queries must be parsed each time they are called. Criteria
queries are typesafe and therefore don't require casting, as JPQL
queries do. The Criteria API is just another Java programming language
API and doesn't require developers to learn the syntax of another query
language. Criteria queries are typically more verbose than JPQL queries
and require the developer to create several objects and perform
operations on those objects before submitting the query to the entity
manager.
