JPQL은 Java의 ORM(Object Relational Mapping) 프레임워크인 JPA(Java Persistence API)에서 제공하는 쿼리 언어입니다. SQL과 비슷하지만, 데이터베이스 테이블이 아닌 자바 객체(Entity)를 대상으로 쿼리를 작성한다는 점이 특징입니다.

SELECT * FROM employeesSELECT e FROM Employee eJPQL의 기본 문법은 SQL과 유사하지만, 엔티티(Entity)와 필드를 대상으로 작업합니다.
📌 기본 문법
SELECT [별칭] FROM [Entity 이름] [별칭] WHERE [조건]
📌 예제 코드
// 엔티티 클래스
@Entity
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private double salary;
// Getters and Setters
}
// JPQL 사용 예시
TypedQuery<Employee> query = entityManager.createQuery(
"SELECT e FROM Employee e WHERE e.salary > :minSalary", Employee.class);
query.setParameter("minSalary", 5000.0);
List<Employee> employees = query.getResultList();
SELECT e FROM Employee e에서 Employee는 엔티티 클래스, e는 별칭입니다.persist() 메서드를 사용합니다.엔티티 간의 관계를 이용해 조인을 작성할 수 있습니다.
예:
SELECT e FROM Employee e JOIN e.department d WHERE d.name = 'IT'
UPPER(), LOWER(), CONCAT(), CURRENT_DATE() 등1️⃣ SELECT 쿼리
// 모든 직원의 이름을 조회
TypedQuery<String> query = entityManager.createQuery(
"SELECT e.name FROM Employee e", String.class);
List<String> employeeNames = query.getResultList();
2️⃣ 파라미터 바인딩
TypedQuery<Employee> query = entityManager.createQuery(
"SELECT e FROM Employee e WHERE e.salary > :minSalary", Employee.class);
query.setParameter("minSalary", 5000.0);
List<Employee> result = query.getResultList();
3️⃣ JOIN
TypedQuery<Employee> query = entityManager.createQuery(
"SELECT e FROM Employee e JOIN e.department d WHERE d.name = :deptName", Employee.class);
query.setParameter("deptName", "IT");
List<Employee> result = query.getResultList();
4️⃣ UPDATE와 DELETE
// 급여 인상
entityManager.createQuery("UPDATE Employee e SET e.salary = e.salary * 1.1 WHERE e.department = :dept")
.setParameter("dept", "IT")
.executeUpdate();
// 직원 삭제
entityManager.createQuery("DELETE FROM Employee e WHERE e.name = :name")
.setParameter("name", "John Doe")
.executeUpdate();
SELECT e FROM employees e (SQL 스타일)SELECT e FROM Employee eSELECT e FROM Employee e JOIN FETCH e.department✅ JPQL 요약
| 항목 | 설명 |
|---|---|
| 대상 | 엔티티와 필드 |
| 문법 | SQL과 유사하지만 객체 지향적 |
| 장점 | DB 독립성, 코드 유지보수성 증가 |
| 주요 기능 | SELECT, JOIN, UPDATE, DELETE 쿼리 지원 |
| 주의사항 | 엔티티 이름 및 필드 사용, Lazy Loading 성능 문제 |
QueryDSL은 JPQL의 한계를 극복하기 위해 등장한 도구입니다.
1️⃣ JPQL의 한계
정적 쿼리 중심: JPQL은 주로 정적으로 작성된 쿼리를 사용하기 때문에 조건에 따라 달라지는 동적 쿼리를 작성하기가 어렵습니다.
문자열 기반 작성: 쿼리를 문자열로 작성하다 보니, 오타나 오류를 실행 중에야 발견할 수 있어 유지보수가 까다롭습니다.
예: 밑의 사진을 보면 SQL문법과 JPQL이 SELECT쿼리문을 사용하는 부분은 동일하지만 JPQL은 객체 지향적인 방식으로 주로 정적으로 작성된 쿼리를 사용합니다.

2️⃣ Criteria의 단점

3️⃣ QueryDSL의 장점

코딩이랑 이것저것 - [JPA] Part 5 (객채지향 쿼리 언어 pt.1)