PedroGeoGISdev wiki
  • Home
  • Linux OS
    • Linux: concepts
    • Linux: basic concepts
    • Linux: Bash
    • Linux: su and sudo
    • Linux: pipes
    • Linux: File System
    • Linux: Virtual Machines

    • Linux: distros
    • Linux Distros: Ubuntu
    • Linux Distros: Mint
    • Linux Distros: Debian
    • Linux Distros: openSuse
    • Linux Distros: Manjaro
    • Linux Distros: Red Hat Enterprise

    • Linux: laboratories
    • Linux Lab#LI01-1: Choose Linux
    • Linux Lab#LI01-2: Install at least three distributions
    • Linux Lab#LI01-3: Adjust user permissions
    • Linux Lab#LI02-1: Export env user with grep and pipe
    • Linux Lab#LI03-1: Manage users and groups
    • Linux Lab#LI03-2: Manage files
    • Linux Lab#LI03-3: Manage software
    • Linux Lab#LI03-4: Manage hardware
    • Linux Lab#LI04-1: Bash scripting, qtool
    • Linux Lab#LI04-2: Bash scripts as terminal tool
    • Linux Lab#LI04-3: Distribute the terminal app

    • Linux readings
    • Linux Resources
  • DevOps
    • What is DevOps
    • DevOps: Introduction
    • DevOps: Agile and Microservices
    • Infrastructure as code (IaC)
    • Immutable Infrastructure
    • Software Lifecycle

    • Documentation
    • How to document: Quarto and Obsidian

    • Network protocols
    • Network: Basics
    • Network: Client-server
    • Network Protocols
    • Network: DNS
    • Network: API Rest
    • Network: gRPC
    • Network: Websocket
    • Network: SMTP
    • Network: Ping
    • Network: UDP
    • Network: webhook
    • Network: SOAP
    • Network: graphQL

    • Version Control
    • Git
    • GitHub
    • Idea and GitHub 2023
    • Git and GitHub 2023 CLI

    • IDEs
    • IDE: Visual Code
    • IDE: IntellJIdea

    • DevOps tools
    • Amazon Web Services AWS
    • Docker
    • Jenkins pipelines
    • Kubernetes k8s
    • Digital Ocean
    • Nagios
    • Ansible

    • DevOps Laboratories
    • Lab 1: chat App
    • Lab 2: Spring Boot AWS AEB manually
    • Lab 3: Spring Boot and AWS S3 publisher
    • Lab 4: Spring Boot Docker/Jenkins
    • Lab 5: k8s on Digital Ocean
    • Lab 6: Spring Boot AWS codecommit

    • DevOps readings
    • DevOps Resources
  • MarkUp
    • MarkUp Languages
    • Introduction Markup
    • HTML Markup
    • Markdown Markup
    • Markdown and HTML working together, good idea?

    • Quarto Markdown
    • Quarto Markdown: basics
    • Quarto Markdown: creating
    • Quarto Markdown: publishing
    • Quarto Markdown: code & data
    • Quarto Markdown: api rest call
    • Quarto Markdown: OJS Cells
    • Quarto Markdown: cheat-sheet

    • Styling: CSS
    • Cascade Style Sheet
    • Cascade Style Sheet: Box Model and Containers
    • CSS: W3.css

    • MarkUp Languages Laboratories
    • Lab#MD01-1: Create and publish by Quarto

    • MarkUp Languages readings
    • MarkUp Languages Resources
  • Java SE
    • What is Java SE
    • Java Standard Edition: Basics
    • Java Standard Edition: Principles
    • Java MOOC Helsinki
    • Java MOOC Helsinki Syllabus

    • Java Create Project
    • Java SE: Maven
    • Java SE: Create Maven Project
    • Java SE: Project push GitHub
    • Java SE: JUnit and TDD

    • Java Concepts
    • Java SE: Class and Objects
    • Java SE: Scope
    • Java SE: static modifier
    • Java SE: Coupling and DDD
    • Java SE: Packages
    • Java SE: Abstract/Interface
    • Java SE: Java 8

    • Java Principles
    • Java SE: Encapsulation
    • Java SE: Abstraction
    • Java SE: Inherence
    • Java SE: Polymorphism

    • Java Design Patterns
    • Java Patterns: UML
    • Java Patterns: Types
    • Singleton
    • Factory
    • Abstract Factory
    • Builder
    • Facade
    • Bridge
    • Decorator
    • Composite
    • Observer
    • Strategy
    • State
    • Commander

    • Java SE Laboratories
    • Lab#SE00-1: Maven Person
    • Lab#SE00-2: Maven Clinic
    • Lab#SE00-3: Library Model
    • Lab#SE00-4: Abstract/Interface Human
    • Lab#SE01-1: Maven/Gradle Person and Account
    • Lab#SE01-2: Maven/Gradle Person and Account stored in JSON
    • Lab#SE02-1: Movie/Review, Model
    • Lab#SE02-2: Movie/Review, CRUD Operations
    • Lab#SE02-3: Movie/Review, factory
    • Lab#SE02-4: Movie/Review, interactivity and coupling
    • Lab#SE02-5: Movie/Review, simulate interactivity by console
    • Lab#SE03-1: Library/Book, Core-Model
    • Lab#SE03-2: Library/Book, Sprint Zero
    • Lab#SE03-3: Library/Book, Expand Model
    • Lab#SE04-1: healthyFood Restaurant, Core Model

    • Java SE readings
    • Java SE Resources
  • Python
    • Python Basics
    • Python: Basic Concepts
    • Python: Tips
  • JavaScript
    • JavaScript Basics
    • JavaScript: Basic Concepts
    • JavaScript: Tips
  • Spring
    • Spring Legacy
    • Spring Framework
    • Spring MVC
    • Springs Servlets

    • Spring Boot Basics
    • Spring Boot: fundamentals
    • Spring Boot: create a Project
    • Spring Boot: H2 DB and Thymeleaf
    • Spring Boot: cycle

    • Spring Boot Concepts
    • Spring Boot: Dependency Injection
    • Spring Boot: Annotations
    • Spring Boot: Controller
    • Spring Boot: View
    • Spring Boot: Thymeleaf
    • Spring Boot: Vaadin Flow
    • Spring Boot: Vaadin Hilla
    • Spring Boot: Model
    • Spring Boot: Rest
    • Spring Boot: Data & DB
    • Spring Boot: JPA & DI
    • Spring Boot: JPA Mappings
    • Spring Boot: JPA Relationships
    • Spring Boot: JPA Queries
    • Spring Boot: JPA Inherence
    • Spring Boot: Scaling

    • Spring Boot Laboratories
    • Lab#SB00-1: Library UML
    • Lab#SB00-2: CRUD User
    • Lab#SB00-3: LibraryManagement
    • Lab#SB00-4: API Rest
    • Lab#SB00-5: Rest & JPA-H2
    • Lab#SB00-6: Rest & MongoDB
    • Lab#SB00-7: Styling
    • Lab#SB01-1: DataBase
    • Lab#SB02-1: JPA Relationships
    • Lab#SB03-1: APIs & cloud
    • Lab#SB04-1: JPA Inherence
    • Lab#SB05-1: API Rest
    • Lab#SB06-1: employeeCourse
    • Lab#SB07-1: monitor Book
    • Lab#SB08-1: Restaurant UML
    • Lab#SB08-2: Vaadin
    • Lab#SB08-3: H2 and API Rest
    • Lab#SB08-4: JPA
    • Lab#SB08-5: Test API Rest
    • Lab#SB09-1: SpringIO Conference

    • Spring Boot readings
    • Spring Boot Resources
  • ReactJS
    • ReactJS: Principles
    • React JS: Introduction
    • React JS: render virtual DOM
    • React JS: Create a React project
    • React JS: Components
    • React JS: JSX
    • React JS: props and state

    • JavaScript: web scripting
    • JavaScript: basics
    • JavaScript: functions
    • JavaScript: objects
    • JavaScript: variables
    • JavaScript: flux control

    • ES6: ECMAScript 6
    • React JS ES6: arrow functions
    • React JS ES6: import modules
    • React JS ES6: array, data and key
    • React JS ES6: destructuring
    • React JS ES6: spread operator

    • ReacJS 18: Hooks
    • React JS: Rules of Hooks
    • ReactJS: useState
    • React JS: useReducer
    • React JS: useRef
    • React JS: useEffect
    • React JS: useContext
    • ReactJS: useMemo
    • ReactJS: custom hooks

    • ReactJS: Designing an App
    • React JS App: async
    • React JS App: events
    • React JS App: router
    • React JS App: conditional render
    • React JS App: styling

    • React JS: Laboratories
    • Lab#RE01-1: API Rest Axios
    • Lab#RE02-1: Router & Hooks
    • Lab#RE03-1: to-do app
    • Lab#RE03-2: HighCharts
    • Lab#RE03-3: API Rest Mono
    • Lab#RE03-4: API Rest Domains
    • Lab#RE03-5: data management
    • Lab#RE04-1: todo & server
    • Lab#RE04-2: Spring Boot & ReactJS
    • Lab#RE05-1: chat & websockets
    • Lab#RE05-2: chat: backend
    • Lab#RE05-3: chat & AWS
    • Lab#RE05-4: chat: test ws AWS
    • Lab#RE05-5: chat & front
    • Lab#RE05-6: chat & ws: front
    • Lab#RE06-1: healthyFood Restaurant
    • Lab#RE06-1-PR: create a pull request
    • Lab#RE07-1: traffic lights simulation

    • React JS readings
    • ReactJS Resources
  • Learning
    • Vocabulary
    • General Vocabulary
    • SCRUM Vocabulary
    • DevOps Vocabulary
    • Java SE Vocabulay
    • Spring Boot Vocabulary
    • DataBase Vocabulary
    • ReactJS Vocabulary
    • Web Vocabulary

    • Learning
    • Useful Questions
    • Learning: tips
    • Writing
    • Taking Notes
    • Comments
    • Document
    • Auto-Evaluate

    • Books & Articles
    • Books
    • Articles

    • What is SCRUM
    • SCRUM Agile Methodology
    • Agile Manifesto & Values
    • SCRUM Guide

    • Scrum Steps
    • Meetings, Impediments and Iterations
    • User stories, Tasks and Habits
    • Delivering Value & Communication
    • ScrumMaster, how it works
    • Mindset, the key to everything
    • Product Owner, how it works
    • Managing Time & Mind
    • Team & the Specialist
    • Albertus’ Dilemma
    • Before SCRUM
    • Team Dynamics
    • Emotions and Thoughts
    • Decision Making and Intuition
    • Beyond SCRUM
    • Balances, atmosphere and tools

    • Resources
    • SCRUM Resources
  • QGIS
    • QGIS basics
    • QGIS: basic concepts

    • QGIS laboratories
    • QGIS Laboratory 1: Introduction to Open Source GIS
  • ArcGIS Pro
    • ArcGIS Pro basics
    • ArcGIS Pro: basic concepts

    • ArcGIS Pro laboratories
    • ArcGIS Pro Laboratory 1: Getting Started
  • Bookmarks
    • Online Resources
    • Online Resources
  • About
    • About me and this site
    • About me
    • About this site
    • About images credit
  • Email
  • GitHub
  • LinkedIn
  1. Spring Boot Concepts
  2. Spring Boot: JPA Queries
  • Spring

  • Spring Legacy
    • Spring Framework
    • Spring MVC
    • Springs Servlets

  • Spring Boot Basics
    • Spring Boot: fundamentals
    • Spring Boot: create a Project
    • Spring Boot: H2 DB and Thymeleaf
    • Spring Boot: cycle

  • Spring Boot Concepts
    • Spring Boot: Dependency Injection
    • Spring Boot: Annotations
    • Spring Boot: Controller
    • Spring Boot: View
    • Spring Boot: Thymeleaf
    • Spring Boot: Vaadin Flow
    • Spring Boot: Vaadin Hilla
    • Spring Boot: Model
    • Spring Boot: Rest
    • Spring Boot: Data & DB
    • Spring Boot: JPA & DI
    • Spring Boot: JPA Mappings
    • Spring Boot: JPA Relationships
    • Spring Boot: JPA Queries
    • Spring Boot: JPA Inherence
    • Spring Boot: Scaling

  • Spring Boot Laboratories
    • Lab#SB00-1: Library UML
    • Lab#SB00-2: CRUD User
    • Lab#SB00-3: LibraryManagement
    • Lab#SB00-4: API Rest
    • Lab#SB00-5: Rest & JPA-H2
    • Lab#SB00-6: Rest & MongoDB
    • Lab#SB00-7: Styling

    • Lab#SB01-1: DataBase
    • Lab#SB02-1: JPA Relationships
    • Lab#SB03-1: APIs & cloud
    • Lab#SB04-1: JPA Inherence
    • Lab#SB05-1: API Rest

    • Lab#SB06-1: employeeCourse

    • Lab#SB07-1: monitor Book

    • Lab#SB08-1: Restaurant UML
    • Lab#SB08-2: Vaadin
    • Lab#SB08-3: H2 and API Rest
    • Lab#SB08-4: JPA
    • Lab#SB08-5: Test API Rest

    • Lab#SB09-1: SpringIO Conference

  • Spring Boot readings
    • Spring Boot Resources

On this page

  • 1 JPQL (Java Persistence Query Language)
    • 1.1 Key Characteristics of JPQL
    • 1.2 JPQL vs SQL
    • 1.3 JPQL Syntax Examples
    • 1.4 Using JPQL in Spring Data JPA
    • 1.5 Benefits of JPQL
  • 2 Relevant ways to Query
    • 2.1 1. Derived Query Methods
  • 3 2. @Query Annotation
  • 4 3. Specification API: filters
  • 5 4. Query by Example (QBE)
  • 6 5. @NamedQueries annotation
  • 7 Additional Resources
    • 7.1 JPQL
    • 7.2 JPA Queries
  • Edit this page
  • Report an issue
  1. Spring Boot Concepts
  2. Spring Boot: JPA Queries

Spring Boot: JPA Queries

Spring Boot JPA Queries

Spring-Boot
JPA
Spring Boot JPA
Author

albertprofe

Published

Tuesday, June 1, 2021

Modified

Sunday, August 10, 2025

📘 JPA Queries

Spring Boot provides an implementation of the Java Persistence API (JPA) to simplify database access: ORM (Object-Relational Mapping)

In JPA, entity classes represent tables in the database, and relationships between entities are mapped using annotations.

JPA (Java Persistence API) enables efficient data retrieval through various querying methods.

It supports JPQL (Java Persistence Query Language) for object-oriented queries.


1 JPQL (Java Persistence Query Language)

JPQL (Java Persistence Query Language) is an object-oriented query language used to define queries for entities and their relationships in JPA (Java Persistence API). It’s similar to SQL but operates on JPA entity objects rather than database tables.

Criteria API for type-safe programmatic queries, and native SQL for database-specific operations. JPA also allows named queries, parameterized queries, and various operations like filtering, sorting, and joining entities.

1.1 Key Characteristics of JPQL

  1. Object-Oriented: Works with Java objects and their properties, not database tables and columns.
  2. Database-Independent: Queries can work across different database systems without modification.
  3. Supports JPA Relationships: Can easily navigate entity relationships.
  4. Powerful: Supports complex operations like joins, aggregations, and subqueries.

1.2 JPQL vs SQL

Here’s a comparison between JPQL and SQL:

Aspect JPQL SQL
Operates on Entity objects Database tables
Case sensitivity Case-sensitive Generally case-insensitive
Portability Database-independent May contain database-specific syntax
Join syntax Simplified using relationships Requires explicit join conditions

1.3 JPQL Syntax Examples

  1. Basic Select Query:
SELECT u FROM User u WHERE u.age > 18
  1. Join Query:
SELECT o FROM Order o JOIN o.customer c WHERE c.country = 'USA'
  1. Aggregate Function:
SELECT AVG(e.salary) FROM Employee e WHERE e.department.name = 'IT'
  1. Subquery:
SELECT e FROM Employee e WHERE e.salary > (SELECT AVG(emp.salary) FROM Employee emp)

1.4 Using JPQL in Spring Data JPA

  1. With @Query annotation:
@Query("SELECT u FROM User u WHERE u.email = ?1 AND u.active = true")
User findActiveUserByEmail(String email);
  1. With EntityManager:
String jpql = "SELECT p FROM Product p WHERE p.category.name = :categoryName";
List<Product> products = entityManager.createQuery(jpql, Product.class)
    .setParameter("categoryName", "Electronics")
    .getResultList();

1.5 Benefits of JPQL

  1. Type-safety: Works with Java types, reducing runtime errors.
  2. Abstraction: Shields developers from database-specific details.
  3. Optimization: JPA providers can optimize JPQL queries for better performance.
  4. Flexibility: Allows for complex queries while maintaining database independence.

2 Relevant ways to Query

Spring Boot offers several ways to create queries when working with JPA repositories.

Method Description Pros Cons
Derived Query Methods Create queries by method names in repository interfaces - Easy to use for simple queries- No need to write SQL/JPQL- Automatic query generation - Limited to simple queries- Can lead to long method names for complex queries
@Query Annotation Write custom JPQL or native SQL queries in repository interfaces - Allows complex queries- Supports both JPQL and native SQL- Can be more readable than derived queries - Queries are strings, so no compile-time checking- Can mix persistence logic with repository interface
Specification API Build dynamic queries programmatically - Flexible for complex, dynamic queries- Type-safe- Reusable query parts - More verbose for simple queries- Requires more setup
Query by Example (QBE) Create queries using domain object instances as examples - Intuitive for simple queries- No need for query language- Works well with dynamic queries - Limited to equality and ‘like’ comparisons- Not suitable for complex conditions
@NamedQueries Define queries at the entity level - Separates query logic from repository- Reusable across multiple repositories- Potentially better performance - Queries are strings, so no compile-time checking- Can clutter entity classes with query definitions

Here are the five most relevant methods, along with examples for the userBorrowBook entities:

2.1 1. Derived Query Methods

Derived query methods allow you to create queries by simply declaring method names in your repository interface. Spring Data JPA automatically generates the query based on the method name.

public interface BookRepository extends JpaRepository {
    List findByAuthorAndAvailableTrue(String author);
    Optional findByIsbn(String isbn);
    List findByPublicationDateAfter(LocalDate date);
}

public interface BorrowRepository extends JpaRepository {
    List findByUserAndIsReturnedFalse(UserApp user);
    List findByBookAndReturnDateBefore(Book book, LocalDate date);
}

public interface UserAppRepository extends JpaRepository {
    List findByAgeGreaterThanAndIsArchivedFalse(int age);
    Optional findByEmail(String email);
}

3 2. @Query Annotation

The @Query annotation allows you to write custom JPQL or native SQL queries directly in your repository interface.

public interface BookRepository extends JpaRepository {
    @Query("SELECT b FROM Book b WHERE b.pagesQty > :minPages AND b.available = true")
    List findAvailableBooksWithMoreThanPages(@Param("minPages") int minPages);
}

public interface BorrowRepository extends JpaRepository {
    @Query("SELECT b FROM Borrow b WHERE b.user.id = :userId AND b.isReturned = false")
    List findActiveUserBorrows(@Param("userId") String userId);
}

public interface UserAppRepository extends JpaRepository {
    @Query(value = "SELECT * FROM user_app WHERE EXTRACT(YEAR FROM AGE(dob)) > :age", nativeQuery = true)
    List findUsersOlderThan(@Param("age") int age);
}

4 3. Specification API: filters

The Specification API allows you to build dynamic queries programmatically. This is useful when you need to create complex queries based on multiple conditions.

public interface BookRepository extends JpaRepository, JpaSpecificationExecutor {
}

public class BookSpecifications {
    public static Specification isAvailable() {
        return (root, query, cb) -> cb.isTrue(root.get("available"));
    }

    public static Specification hasAuthor(String author) {
        return (root, query, cb) -> cb.equal(root.get("author"), author);
    }
}

// Usage
List availableBooksByAuthor = bookRepository.findAll(where(isAvailable()).and(hasAuthor("J.K. Rowling")));

5 4. Query by Example (QBE)

Query by Example allows you to create queries using domain object instances as examples.

public interface BookRepository extends JpaRepository, QueryByExampleExecutor {
}

// Usage
Book exampleBook = new Book();
exampleBook.setAuthor("George Orwell");
exampleBook.setAvailable(true);

Example example = Example.of(exampleBook);
List books = bookRepository.findAll(example);

6 5. @NamedQueries annotation

@NamedQueries is another powerful way to create queries in Spring Boot JPA. This method allows you to define queries at the entity level, separating the query definition from the repository interface.

Here’s how you can use @NamedQueries with our entities:

@Entity
@NamedQueries({
    @NamedQuery(name = "Book.findAvailableByAuthor",
        query = "SELECT b FROM Book b WHERE b.author = :author AND b.available = true"),
    @NamedQuery(name = "Book.countByPublicationYear",
        query = "SELECT COUNT(b) FROM Book b WHERE FUNCTION('YEAR', b.publicationDate) = :year")
})
public class Book {
    // ... existing fields and methods
}

@Entity
@NamedQueries({
    @NamedQuery(name = "Borrow.findOverdueBorrows",
        query = "SELECT b FROM Borrow b WHERE b.returnDate  {
    List findAvailableByAuthor(@Param("author") String author);
    long countByPublicationYear(@Param("year") int year);
}

public interface BorrowRepository extends JpaRepository {
    List findOverdueBorrows();
    int sumPointsByUser(@Param("userId") String userId);
}

public interface UserAppRepository extends JpaRepository {
    List findActiveUsersByAgeRange(@Param("minAge") int minAge, @Param("maxAge") int maxAge);
    @Modifying
    @Query(name = "UserApp.updateUserAddress")
    int updateUserAddress(@Param("newAddress") String newAddress, @Param("userId") String userId);
}

Using @NamedQueries offers several advantages:

  1. It separates query logic from the repository interface, improving code organization.
  2. It allows for easy reuse of complex queries across multiple repositories.
  3. It provides better performance as named queries are parsed and prepared when the persistence unit is created[1].

Remember to follow the naming convention . for Spring Data JPA to automatically resolve and use the named queries.

7 Additional Resources

7.1 JPQL

  • JPQL - Java Persistence Query Language
  • JPA Query Language
  • JPQL Reference
  • Spring Data JPA - Query Creation

7.2 JPA Queries

For more information on Spring Boot JPA query methods, check out these resources:

  • Defining Query Methods
  • Query by Example
  • JPA Query Methods
  • Spring Boot: JPA & DI
Back to top
Spring Boot: JPA Relationships
Spring Boot: JPA Inherence

This website is built with Quarto.

Difficulties are just things to overcome, after all. Ernest Shackleton

  • Edit this page
  • Report an issue