JPQL 기초
Entity 중심 조회와 파라미터 바인딩
•
#jpa#jpql
JPQL 기초
JPQL은 테이블이 아니라 Entity 객체를 대상으로 작성하는 객체지향 쿼리 언어다. SQL과 문법은 비슷하지만, tbl_menu 같은 테이블명 대신 Menu 엔티티와 필드명을 사용한다.
기본 조회
String jpql = "select m from Menu m where m.menuPrice > :price"; List<Menu> menus = entityManager.createQuery(jpql, Menu.class) .setParameter("price", 10000) .getResultList();
결과가 여러 건이면 getResultList(), 단건이면 getSingleResult()를 사용한다. 단건 조회는 결과가 없거나 둘 이상일 때 예외가 발생할 수 있어 상황에 맞게 처리해야 한다.
파라미터 바인딩
문자열을 직접 이어 붙여 조건을 만들면 SQL Injection 위험과 문법 오류가 커진다. JPQL에서는 이름 기반 파라미터 :price를 사용해 값을 바인딩하는 방식이 안전하다.
Projection
필요한 컬럼만 DTO로 받고 싶을 때 생성자 표현식을 사용할 수 있다.
select new com.example.MenuResponse(m.menuCode, m.menuName, m.menuPrice) from Menu m
Entity 전체가 필요하지 않은 목록 화면에서는 DTO projection이 데이터 노출과 조회 비용을 줄이는 데 도움이 된다.
페이징
query.setFirstResult(page * size); query.setMaxResults(size);
JPQL 자체에 DB별 LIMIT 문법을 쓰지 않고 JPA API로 시작 위치와 개수를 지정한다. JPA 구현체가 DB 방언에 맞는 SQL로 변환한다.
정리
JPQL은 Entity 중심 조회가 필요할 때 유용하다. 단, 동적 조건이 많아질수록 문자열 조립이 복잡해지므로 Spring Data JPA, QueryDSL, Criteria 같은 대안을 함께 고려할 수 있다.