Spring_Data_JPA_Full_Guide
Spring_Data_JPA_Full_Guide
Spring Data JPA provides a rich set of derived query keywords that translate into SQL queries.
## **Comparison Operators**
| **Spring Data JPA Keyword** | **SQL Equivalent** | **Example Query Method** | **Generated
SQL** |
|----------------------|----------------|----------------------|----------------------|
| After | `>` (for dates) | `findByCreatedAtAfter(LocalDate date)` | `SELECT * FROM user WHERE
created_at > ?` |
| Before | `<` (for dates) | `findByCreatedAtBefore(LocalDate date)` | `SELECT * FROM user
WHERE created_at < ?` |
| IsGreaterThan | `>` | `findBySalaryIsGreaterThan(Double salary)` | `SELECT * FROM user
WHERE salary > ?` |
| IsLessThan | `<` | `findBySalaryIsLessThan(Double salary)` | `SELECT * FROM user WHERE
salary < ?` |
---
| **Spring Data JPA Keyword** | **SQL Equivalent** | **Example Query Method** | **Generated
SQL** |
|----------------------|----------------|----------------------|----------------------|
| Contains | `LIKE %value%` | `findByNameContaining(String name)` | `SELECT * FROM user
WHERE name LIKE %?%` |
| NotContains | `NOT LIKE %value%` | `findByNameNotContaining(String name)` | `SELECT *
FROM user WHERE name NOT LIKE %?%` |
| StartsWith | `LIKE value%` | `findByNameStartingWith(String prefix)` | `SELECT * FROM user
WHERE name LIKE ?%` |
| EndsWith | `LIKE %value` | `findByNameEndingWith(String suffix)` | `SELECT * FROM user
WHERE name LIKE %?` |
| IsTrue | `= TRUE` | `findByActiveIsTrue()` | `SELECT * FROM user WHERE active = TRUE` |
| IsFalse | `= FALSE` | `findByActiveIsFalse()` | `SELECT * FROM user WHERE active = FALSE` |
---
# 3. Date-Based Queries
| **Spring Data JPA Keyword** | **SQL Equivalent** | **Example Query Method** | **Generated
SQL** |
|----------------------|----------------|----------------------|----------------------|
| After | `>` | `findByCreatedAtAfter(LocalDateTime date)` | `SELECT * FROM user WHERE
created_at > ?` |
| Before | `<` | `findByCreatedAtBefore(LocalDateTime date)` | `SELECT * FROM user WHERE
created_at < ?` |
| Between | `BETWEEN` | `findByCreatedAtBetween(LocalDate start, LocalDate end)` | `SELECT *
FROM user WHERE created_at BETWEEN ? AND ?` |
| Year | `YEAR(column) = ?` | `findByCreatedAtYear(int year)` | `SELECT * FROM user WHERE
YEAR(created_at) = ?` |
| Month | `MONTH(column) = ?` | `findByCreatedAtMonth(int month)` | `SELECT * FROM user
WHERE MONTH(created_at) = ?` |
| Day | `DAY(column) = ?` | `findByCreatedAtDay(int day)` | `SELECT * FROM user WHERE
DAY(created_at) = ?` |
---
Spring Data JPA supports queries on relationships like OneToMany and ManyToOne.
---
# 5. Subqueries in Spring Data JPA
---
Spring Data JPA allows different types of joins to fetch related entities.
## INNER JOIN
```java
@Query("SELECT o FROM Order o INNER JOIN o.user u WHERE u.name = :name")
List<Order> findOrdersByUserName(@Param("name") String name);
```
**Generated SQL:**
```sql
SELECT o.* FROM orders o
INNER JOIN user u ON o.user_id = u.id
WHERE u.name = ?;
```
## LEFT JOIN
```java
@Query("SELECT u FROM User u LEFT JOIN FETCH u.orders")
List<User> findAllUsersWithOrders();
```
**Generated SQL:**
```sql
SELECT u.*, o.* FROM user u
LEFT JOIN orders o ON u.id = o.user_id;
```
---
---
# **Summary**
By mastering these **Spring Data JPA derived query techniques**, you can build **highly
optimized** and **complex** queries effortlessly!