JPA Buddy
announcement - icon

JPA is huge! It covers nearly every aspect of communication between relational databases and the Java application and is deeply integrated into all major frameworks.

If you're using IntelliJ, JPA Buddy is super helpful. The plugin gently guides you through the subtleties of the most popular JPA implementations, visually reminds you of JPA features, generates code that follows best practices, and integrates intelligent inspections to improve your existing persistence code.

More concretely, it provides powerful tooling to generate Spring Data JPA repositories and methods, Flyway Versioned Migrations, Liquibase Differential Changelogs, DDL and SQL statements, DTO objects, and MapStruct interfaces.

Oh, and it actually generates JPA entities from an existing database and gradually update the data model as the database evolves! Yeah.

>> Become a lot more productive with JPA Buddy

Persistence top

Get started with Spring Data JPA through the reference Learn Spring Data JPA course:


1. Overview

In this quick tutorial, we’ll look at how to get all data from a table with Hibernate using JPQL or the Criteria API.

JPQL provides us with a quicker and simpler implementation while using the Criteria API is more dynamic and robust.


JPQL provides a simple and straightforward way to get all entities from a table.

Let's see what it might look like to retrieve all students from a table using JPQL:

public List<Student> findAllStudentsWithJpql() {
    return session.createQuery("SELECT a FROM Student a", Student.class).getResultList();      

Our Hibernate session's createQuery() method receives a typed query string as the first argument and the entity's type as the second. We execute the query with a call to the getResultList() method which returns the results as a typed List.

Simplicity is the advantage of this approach. JPQL is very close to SQL, and is, therefore, easier to write and understand.

3. Criteria API

The Criteria API provides a dynamic approach for building JPA queries.

It allows us to build queries by instantiating Java objects that represent query elements. And it's a cleaner solution if queries are constructed from many optional fields because it eliminates a lot of string concatenations.

We just saw a select-all query using JPQL. Let's take a look at its equivalent using the Criteria API:

public List<Student> findAllStudentsWithCriteriaQuery() {
    CriteriaBuilder cb = session.getCriteriaBuilder();
    CriteriaQuery<Student> cq = cb.createQuery(Student.class);
    Root<Student> rootEntry = cq.from(Student.class);
    CriteriaQuery<Student> all =;

    TypedQuery<Student> allQuery = session.createQuery(all);
    return allQuery.getResultList();

First, we get a CriteriaBuilder which we use to create a typed CriteriaQuery. Later, we set the root entry for the query. And lastly, we execute it with a getResultList() method.

Now, this approach is similar to what we did earlier. But, it gives us complete access to the Java language to articulate greater nuance in formulating the query.

In addition to being similar, JPQL queries and JPA criteria-based queries are equivalently performant.

4. Conclusion

In this article, we demonstrated how to get all entities from a table using JPQL or Criteria API.

The complete source code for the example is available over on GitHub.

Persistence bottom
Get started with Spring Data JPA through the reference Learn Spring Data JPA course: >> CHECK OUT THE COURSE
Persistence footer banner
Comments are closed on this article!