반응형
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 |