What is JPQL in JPA?
JPQL stands for:
Java Persistence Query Language
JPQL is a query language used in JPA to fetch and manipulate data from the database using entity objects instead of table names.
In simple words:
âJPQL allows developers to write database queries using Java entity classes rather than SQL tables.â
Why JPQL is Needed
In traditional SQL:
- Queries are written using table names
- Column names are used directly
- Database-specific syntax may vary
JPQL solves these problems by:
- Using entity names instead of table names
- Using object-oriented queries
- Providing database independence
Simple Real-Time Example
Suppose:
- Student entity maps to students table
SQL query:
SELECT * FROM students;
Equivalent JPQL query:
SELECT s FROM Student s
Main Difference Between SQL and JPQL
| Feature | SQL | JPQL |
|---|---|---|
| Works On | Database tables | Entity classes |
| Uses | Table names | Entity names |
| Database Dependent | Yes | No |
| Object-Oriented | No | Yes |
Entity Example
@Entity
public class Student {
@Id
private Long id;
private String name;
private String email;
}
Basic JPQL Query Example
SELECT s FROM Student s
Here:
- Student â Entity class
- s â Alias
How JPQL Works Internally
- Developer writes JPQL query
- Hibernate converts JPQL to SQL
- Database executes generated SQL
- Results are mapped to entities
Generated SQL Example
JPQL:
SELECT s FROM Student s
Hibernate generates:
SELECT *
FROM students
Using JPQL in Spring Boot
JPQL is commonly used with:
- @Query annotation
- EntityManager
@Query Example
@Query("SELECT s FROM Student s")
List<Student> getAllStudents();
Find by Condition Example
@Query("""
SELECT s
FROM Student s
WHERE s.name = :name
""")
List<Student> findByName(String name);
Generated SQL
SELECT *
FROM students
WHERE name = ?
JPQL SELECT Query
Used to retrieve entity data.
Example
SELECT s FROM Student s
JPQL WHERE Clause
Used to filter data.
Example
SELECT s
FROM Student s
WHERE s.email = :email
JPQL ORDER BY Clause
Used to sort results.
Example
SELECT s
FROM Student s
ORDER BY s.name ASC
JPQL GROUP BY Clause
Used for grouping records.
Example
SELECT s.department,
COUNT(s)
FROM Student s
GROUP BY s.department
JPQL JOIN Query
JPQL supports entity relationships and joins.
JOIN Example
SELECT o
FROM Order o
JOIN o.customer c
WHERE c.name = :name
Generated SQL
SELECT o.*
FROM orders o
JOIN customers c
ON o.customer_id = c.id
WHERE c.name = ?
JPQL FETCH JOIN
FETCH JOIN loads related entities immediately.
FETCH JOIN Example
SELECT c
FROM Customer c
JOIN FETCH c.orders
Why FETCH JOIN is Useful
It helps avoid:
- N+1 query problem
- Excessive lazy loading queries
JPQL Named Parameters
JPQL supports named parameters using:
:parameterName
Example
@Query("""
SELECT s
FROM Student s
WHERE s.name = :name
""")
Student findByName(
@Param("name") String name
);
JPQL Positional Parameters
JPQL also supports positional parameters.
Example
@Query("""
SELECT s
FROM Student s
WHERE s.name = ?1
""")
Student findByName(String name);
JPQL UPDATE Query
Used to update records.
Example
@Modifying
@Query("""
UPDATE Student s
SET s.name = :name
WHERE s.id = :id
""")
void updateStudentName(
Long id,
String name
);
JPQL DELETE Query
Used to delete records.
Example
@Modifying
@Query("""
DELETE
FROM Student s
WHERE s.id = :id
""")
void deleteStudent(Long id);
JPQL Aggregate Functions
JPQL supports functions such as:
- COUNT()
- SUM()
- AVG()
- MIN()
- MAX()
COUNT Example
SELECT COUNT(s)
FROM Student s
JPQL Pagination Example
Pageable pageable =
PageRequest.of(0, 10);
studentRepository.findAll(pageable);
Advantages of JPQL
- Database independent
- Object-oriented queries
- Supports entity relationships
- Readable and maintainable
- Integrated with Hibernate
Disadvantages of JPQL
- Complex queries can become difficult
- Limited compared to native SQL
- Performance tuning may be harder
Difference Between JPQL and Native SQL
| Feature | JPQL | Native SQL |
|---|---|---|
| Uses | Entities | Tables |
| Database Independence | Yes | No |
| Complex SQL Features | Limited | Full support |
| Portability | High | Lower |
Real-Time Example in E-Commerce Application
E-commerce application contains:
- Customers
- Orders
- Products
JPQL helps:
- Fetch customer orders
- Generate reports
- Perform filtering and searching
Best Practices for JPQL
- Use meaningful aliases
- Prefer named parameters
- Use FETCH JOIN carefully
- Optimize complex queries
- Use pagination for large datasets
Common Interview Questions on JPQL
What is JPQL?
JPQL is an object-oriented query language used in JPA.
What is the difference between SQL and JPQL?
SQL uses table names, while JPQL uses entity classes.
What is FETCH JOIN?
FETCH JOIN loads related entities immediately.
Can JPQL perform UPDATE and DELETE operations?
Yes.
What are named parameters in JPQL?
Parameters prefixed with colon (:).
Conclusion
JPQL is one of the most important features in JPA and Hibernate.
It allows developers to:
- Write object-oriented database queries
- Use entity relationships easily
- Build database-independent applications
- Reduce manual SQL coding
Understanding JPQL is essential for Spring Boot developers because enterprise applications heavily rely on efficient querying, filtering, reporting, and relationship handling.
Proper use of JPQL improves:
- Maintainability
- Scalability
- Performance optimization
- Developer productivity