0
0
SpringbootHow-ToBeginner · 4 min read

How to Use JPQL in Spring Boot: Simple Guide with Examples

In Spring Boot, use @Query annotation with JPQL inside a repository interface to write database queries using entity objects. JPQL queries use entity class names and fields instead of table names and columns, making them object-oriented and portable.
📐

Syntax

JPQL queries are written using entity class names and their fields, not database tables. Use @Query annotation in a Spring Data JPA repository interface to define JPQL queries.

  • SELECT: Choose entities or fields.
  • FROM: Specify entity class.
  • WHERE: Filter results with conditions.
  • Parameters: Use :paramName for dynamic values.
java
public interface UserRepository extends JpaRepository<User, Long> {
    @Query("SELECT u FROM User u WHERE u.email = :email")
    User findByEmail(@Param("email") String email);
}
💻

Example

This example shows a Spring Boot repository using JPQL to find users by their email. It demonstrates how to write a JPQL query with a parameter and how Spring injects the value.

java
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String email;

    // getters and setters
}

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    @Query("SELECT u FROM User u WHERE u.email = :email")
    User findByEmail(@Param("email") String email);

    @Query("SELECT u FROM User u WHERE u.name LIKE %:namePart%")
    List<User> findByNameContains(@Param("namePart") String namePart);
}

// Usage in a service or controller
// User user = userRepository.findByEmail("test@example.com");
// List<User> users = userRepository.findByNameContains("John");
Output
User object with email 'test@example.com' or list of users whose names contain 'John'
⚠️

Common Pitfalls

Common mistakes when using JPQL in Spring Boot include:

  • Using database table names instead of entity class names in queries.
  • Referencing database column names instead of entity field names.
  • Forgetting to use @Param annotation for query parameters.
  • Writing native SQL syntax instead of JPQL syntax.

Always remember JPQL works with Java entities, not tables.

java
public interface UserRepository extends JpaRepository<User, Long> {
    // Wrong: uses table name and column
    // @Query("SELECT * FROM users WHERE email = :email")
    // User findByEmail(@Param("email") String email);

    // Right: uses entity and field names
    @Query("SELECT u FROM User u WHERE u.email = :email")
    User findByEmail(@Param("email") String email);
}
📊

Quick Reference

JPQL KeywordPurposeExample
SELECTChoose entities or fieldsSELECT u FROM User u
FROMSpecify entity classFROM User u
WHEREFilter resultsWHERE u.email = :email
ORDER BYSort resultsORDER BY u.name ASC
JOINJoin related entitiesJOIN u.roles r
LIKEPattern matchingWHERE u.name LIKE %:namePart%

Key Takeaways

Use @Query annotation in Spring Data JPA repositories to write JPQL queries.
JPQL queries use entity class names and fields, not database tables or columns.
Always annotate method parameters with @Param to bind query parameters.
Avoid mixing SQL syntax with JPQL; they have different rules.
Test queries to ensure they match your entity model and return expected results.