[Spring] 동적쿼리(JPQL)

Yuri·2025년 2월 14일

Spring

목록 보기
15/21

🔫 페이징을 구현하며 겪은 문제점과 해결방법, 새로 알게된 점을 기록합니다.

JPQL

Java Persistence Query Language
JPA(Java Persistence API) 에서 사용하는 객체 지향 쿼리 언어
객체 모델을 대상으로 쿼리를 작성한다.
즉, 데이터베이스의 테이블이 아닌 JPA 엔티티를 기반으로 쿼리를 작성하는 방식

특징

  • 객체 지향적
    SQL이 테이블과 컬럼을 대상으로 하는 것과 달리, JPQL은 엔티티 클래스와 필드를 대상으로 쿼리를 작성
  • 엔티티 클래스 기준
    쿼리에서 사용하는 FROM 절이나 WHERE 절에 등장하는 것은 데이터베이스 테이블이 아니라, JPA 엔티티이다.
  • 실행 시 자동 매핑
    JPQL은 SQL 처럼 데이터베이스와 상호작용하지만, 결과는 엔티티 객체로 반환된다
  • 동적 쿼리 작성
    문자열로 쿼리를 작성하는 방식이므로, 동적 쿼리를 쉽게 작성할 수 있다. 사용자가 입력한 검색 조건에 맞게 WHERE 절을 동적으로 추가하는 방식으로 쿼리를 변경

기본문법

  1. SELECT
SELECT e FROM Employee e
  1. WHERE
SELECT e FROM Employee e WHERE e.name = :name
  1. AND, OR 조건
SELECT e FROM Employee e WHERE e.name = :name AND e.age = :age
  1. LIKE 연산자
SELECT e FROM Employee e WHERE e.name LIKE %:name%
  1. ORDER BY 절
SELECT e FROM Employee e ORDER BY e.age DESC
  1. JOIN
SELECT e FROM Employee e JOIN e.department d WHERE d.name = :departmentName

@Query

Spring Data JPA에서는 @Query 어노테이션을 사용해 JPQL 쿼리를 직접 작성

public interface EmployeeRepository extends JpaRepository<Employee, Long> {

    @Query("SELECT e FROM Employee e WHERE e.name = :name")
    List<Employee> findByName(@Param("name") String name);
}

@filter

  • Hibernate에서 제공하는 기능으로, 엔티티 클래스에 조건을 추가하여 동적으로 데이터를 필터링할 수 있게 해주는 기능
  • 필터를 사용하면 JPQL과 결합하여 특정 조건을 쉽게 적용할 수 있다.
  1. 필터 정의
  2. 필터 활성화
  3. JPQL 쿼리와 결합
  4. 필터 해제
  5. 다중 필터 사용

추가예정

네이티브 SQL, QueryDSL

profile
안녕하세요 :)

0개의 댓글