Advanced JPA Criteria Queries in Spring Boot

Spring Data JPA gives us simple methods like findByName() or custom queries using @Query. But when you need to build dynamic, complex queries at runtime (especially with multiple filters), Criteria API is the most powerful and flexible tool.

This post will walk you through:

  • What is the JPA Criteria API
  • Why use it instead of JPQL or native SQL
  • How to use it in Spring Boot
  • Advanced use cases like joins, predicates, pagination
  • Best practices
Advanced JPA Criteria Queries in Spring Boot

🧠 What is Criteria API?

The JPA Criteria API allows you to construct queries programmatically in Java using a type-safe, object-oriented API.

It’s like building SQL queries without writing actual SQL.

⚑ Why Use Criteria API?

When to UseWhy
Dynamic FiltersBuild queries with optional parameters
Complex Joins and SubqueriesEasier than writing JPQL manually
Type SafetyNo syntax errors at runtime
Compile-Time CheckingRefactor-friendly

🧱 Basic Building Blocks

  • CriteriaBuilder: Factory for query parts
  • CriteriaQuery: Represents a query object
  • Root: Represents table/entity
  • Predicate: WHERE conditions

πŸ§ͺ Example Setup

Let’s use a User entity:

πŸ”§ 1. Basic Criteria Query

🧩 2. Multiple Conditions (Dynamic Filters)

βœ… This is useful for building dynamic search filters in real-world applications.

πŸ” 3. Using Joins (e.g., User β†’ Department)

πŸ“„ 4. Sorting and Pagination

🎯 5. Using CriteriaQuery for Count

Useful for pagination metadata:

🧠 6. CriteriaBuilder with IN Clause

πŸ—οΈ 7. Reusable Utility for Dynamic Filtering

A reusable method to build Predicate list dynamically:

Then use it in your repository:

βœ… Best Practices

PracticeWhy
βœ… Use Metamodel for type safety (via @StaticMetamodel)Prevents string-based errors
βœ… Encapsulate criteria logic into service or helperKeeps repository clean
βœ… Use Criteria for complex, dynamic queriesBetter than string-based JPQL
❌ Avoid mixing Criteria and native queriesKeep query styles consistent
❌ Don’t use Criteria for simple queriesNamed queries or method names are easier

πŸ§ͺ Summary

  • Criteria API is powerful for type-safe, dynamic queries
  • Useful for filtering, joins, pagination, and sorting
  • Consider using Specifications if you use Spring Data JPA (alternative abstraction)
  • Don’t overuse it for basic queries

References

JPA criteria Docs