[JPA] JPQL 기본 문법과 기능 :: 잡다한 프로그래밍
반응형

JPQL 설명에 필요할 예제 모델은 아래와 같다

 

JPQL 문법 구조

1. SELECT 문

 

select_절

from_절

[where_절]

[groupby_절]

[having_절]

[orderby_절]

SELECT m FROM Member m WHERE m.age > 18

 

2. UPDATE 문

update_절 [where_절]
UPDATE Member m SET m.age = 30 WHERE m.username = :name

3. DELETE 문

delete_절 [where_절]
DELETE FROM Member m WHERE m.age < 18
  • Member는 테이블이 아니라 엔티티 이름 (@Entity(name="이값")
  • m은 필수 별칭(alias) (as 생략 가능)
  • 대소문자 구분:
    • 엔티티와 필드: 구분함 (username ≠ USERNAME)
    • JPQL 키워드: 구분 안함 (select, SELECT 둘 다 가능)

 

집계 함수

SELECT 
    COUNT(m),     -- 총 회원 수
    SUM(m.age),   -- 나이 합
    AVG(m.age),   -- 평균 나이
    MAX(m.age),   -- 최대 나이
    MIN(m.age)    -- 최소 나이
FROM Member m

SELECT m.team.name, AVG(m.age)
FROM Member m
GROUP BY m.team.name
HAVING AVG(m.age) > 20
ORDER BY AVG(m.age) DESC

TypedQuery vs Query

구분 설명 사용 예

 

구분 설명
TypedQuery<T> 반환 타입이 명확할 때
Query 반환 타입이 다양한 경우 (e.g. username, age 같이 복합)
// 반환 타입 명확
TypedQuery<Member> query1 = em.createQuery("SELECT m FROM Member m", Member.class);

// 반환 타입 모호 (String, int 두개 반환)
Query query2 = em.createQuery("SELECT m.username, m.age FROM Member m");

 

결과 조회 API

메서드 설명 예외
메서드 설명 예외
getResultList() 결과가 0개 이상일 때 리스트 반환 없음 (0개면 빈 리스트)
getSingleResult() 결과가 정확히 1개여야 함 0개: NoResultException, 2개 이상: NonUniqueResultException

파라미터 바인딩

1. 이름 기준 바인딩 (권장)

TypedQuery<Member> query = em.createQuery(
    "SELECT m FROM Member m WHERE m.username = :username",
    Member.class
);
query.setParameter("username", "kim");

2. 위치 기준 바인딩 (비추천)

Query query = em.createQuery(
    "SELECT m FROM Member m WHERE m.username = ?1"
);
query.setParameter(1, "kim");
반응형

'프로그래밍 > JPA' 카테고리의 다른 글

[JPA] 페이징, 조인, 서브쿼리 등  (3) 2025.07.31
[JPA] 프로젝션  (2) 2025.07.31
[JPA] JPQL 소개  (2) 2025.07.30
[JPA] 값 타입 컬렉션  (1) 2025.07.25
[JPA] 값 타입과 불변 객체  (2) 2025.07.23

+ Recent posts