🧩 @Subselect

정의

@SubselectHibernate에서 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과 함께 사용한다.

연결문서

댓글남기기