JPQL

JPQL(Java Persistence Query Language) 은 엔티티 객체를 대상으로 쿼리하는 JPA 전용 쿼리 언어입니다.

쉽게 말하면

SQL은 테이블을 대상으로 쿼리하고, JPQL은 엔티티(객체) 를 대상으로 쿼리해요.

SQL vs JPQL 비교

SQL (테이블 대상)

SELECT * FROM users WHERE name = '홍길동'

JPQL (엔티티 대상)

SELECT u FROM User u WHERE u.name = '홍길동'
구분SQLJPQL
대상테이블, 컬럼엔티티, 필드
대소문자구분 안 함엔티티/필드는 구분함
결과Row엔티티 객체

왜 필요한가?

entityManager.find()는 단순 조회만 가능해요. JPA 기본 메서드로는 사용이 불가할 때 사용

// 이건 가능 - ID로 단건 조회
User user = entityManager.find(User.class, 1L);

// 이런 건 불가능 - 복잡한 조건 조회
// 이름이 '홍길동'인 사용자 전체 조회?
// 나이가 20 이상인 사용자?

이런 복잡한 조회를 위해 JPQL이 필요합니다.

사용 예시

// 기본 조회
String jpql = "SELECT u FROM User u WHERE u.name = :name";
List<User> users = entityManager.createQuery(jpql, User.class)
    .setParameter("name", "홍길동")
    .getResultList();

// 조건 조회
String jpql2 = "SELECT u FROM User u WHERE u.age >= 20";

// 정렬
String jpql3 = "SELECT u FROM User u ORDER BY u.createdAt DESC";

// 조인
String jpql4 = "SELECT u FROM User u JOIN u.team t WHERE t.name = '개발팀'";

JPQL의 장점

// JPQL - DB가 바뀌어도 코드 변경 없음
"SELECT u FROM User u WHERE u.name = :name"

// 실행 시 각 DB에 맞게 변환됨
// MySQL: SELECT * FROM users WHERE name = ?
// Oracle: SELECT * FROM USERS WHERE NAME = ?

Spring Data JPA에서는

직접 JPQL 작성할 일이 줄어들어요.

public interface UserRepository extends JpaRepository<User, Long> {

    // 메서드 이름으로 자동 생성
    List<User> findByName(String name);

    // 직접 JPQL 작성도 가능
    @Query("SELECT u FROM User u WHERE u.age >= :age")
    List<User> findByAgeGreaterThan(@Param("age") int age);
}

한줄 요약

JPQL = 테이블이 아닌 엔티티 객체를 대상으로 하는 SQL과 비슷한 쿼리 언어

CSLOG에서 보기