@Subselect
🧩 @Subselect
정의
@Subselect는 Hibernate에서 SELECT 쿼리 결과를 엔티티처럼 매핑할 수 있게 해주는 애너테이션이다. 실제 테이블이 아니라 조회 쿼리의 결과를 읽기 전용 엔티티로 다루고 싶을 때 사용한다.
복잡한 집계 쿼리나 조인 결과를 하나의 조회 전용 모델로 묶고 싶을 때 유용하다.
🧩 역할
- SELECT 결과를 엔티티처럼 다룬다
- 복잡한 조회 쿼리를 읽기 전용 모델로 매핑한다
- 실제 테이블 구조를 바꾸지 않고도 결과를 표현할 수 있다
- 집계나 조인 결과를 화면용 모델로 다루기 좋다
🛠 사용법
적용 예시
import org.hibernate.annotations.Immutable;
import org.hibernate.annotations.Subselect;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
@Immutable // 엔티티는 읽기 전용
@Subselect(
"SELECT e.id AS id, e.name AS name, COUNT(o.id) AS order_count " +
"FROM employee e " +
"LEFT JOIN orders o ON e.id = o.employee_id " +
"GROUP BY e.id, e.name"
)
public class EmployeeOrderSummary {
@Id
private Long id;
private String name;
private Long orderCount;
}
🧩 특징
- 읽기 전용으로 사용하는 것이 일반적이다
- 실제 테이블이 아닌 쿼리 결과를 매핑한다
- Hibernate 전용 기능이다
- 집계, 통계, 요약 조회에 적합하다
⚠️ 주의사항
@Subselect는 JPA 표준이 아니라 Hibernate 전용 기능이다.- 일반적으로
@Immutable과 함께 사용한다. - 데이터 변경이 필요한 엔티티에는 사용하지 않는 것이 좋다.
- 쿼리 결과 컬럼과 엔티티 필드명이 맞아야 한다.
📌 정리
@Subselect는 SELECT 결과를 엔티티처럼 매핑하는 Hibernate 애너테이션이다.- 집계나 조인 결과를 읽기 전용으로 표현할 때 유용하다.
- 보통
@Immutable과 함께 사용한다.
댓글남기기