Programing/JPA

JPA Entity 내 Subquery 로 동작하는 속성 추가 방법 @Formula

리커니 2024. 5. 8. 09:15
반응형

JPA Entity 에서 table 에는 존재하지 않지만, 특정 속성을 추가하여 관리해야되는 경우가 있습니다.

이렇 때 사용하는 것이 @Formula 이고, subqyery로 동작하게 됩니다.

 

예를들어 아래와 같은 테이블이 있습니다.

 

여기서 진행중인 프로젝트를 조회를 한다면

프로젝트 시작일자 <= 현재일자 <= 프로젝트 종료일자

 

진행중이지 않은 프로젝트를 조회한다면

현재일자 < 프로젝트 시작일자 OR 현재일자 > 프로젝트 종료일자

 

의 조건을 설정해야 합니다.

 

진행중 이라는 컬럼이 있으면 단순히 Y, N 으로 조회 할 수 있을 것 같습니다.

이럴 때 @Formula 를 사용하여 처리 할 수 있습니다.

 

@Getter
@Setter
@Entity(name = "project")
public class Project extends BaseEntity {

    @Id
    @GenericGenerator(name = "ProjectIdGenerator", type = IdGeneratorUtil.class
            , parameters = @org.hibernate.annotations.Parameter(name = GENERATOR_PARAM_KEY, value = "project"))
    @GeneratedValue(generator = "ProjectIdGenerator")
    @Column(name = "project_id")
    private String projectId;

    @Column(name = "project_name")
    private String projectName;

    @Column(name = "project_start_date")
    @Temporal(TemporalType.DATE)
    private LocalDate projectStartDate;

    @Column(name = "project_end_date")
    @Temporal(TemporalType.DATE)
    private LocalDate projectEndDate;

    @Formula("(select case when project_start_date >= now() or project_end_date  <= now() then 'Y' else 'N' end from project t1 where t1.project_id = project_id)")
    @Enumerated(EnumType.STRING)
    private UseYn isProceeding;
}

 

위와 같이 @Formula() 내에 String 으로 query를 작성하면 조회 시 subquery로 동작을 하게 됩니다.

로그를 보도록 하죠.

select
        p1_0.project_id,
        p1_0.create_dt,
        (select
            case 
                when p1_0.project_start_date >= now() 
                or p1_0.project_end_date  <= now() 
                    then 'Y' 
                else 'N' 
            end 
        from
            project t1 
        where
            t1.project_id = p1_0.project_id),
        p1_0.update_dt,
        p1_0.project_end_date,
        p1_0.project_name,
        p1_0.project_start_date 
    from
        project p1_0 
    where
        lower(p1_0.project_name) like ? escape '' 
    order by
        p1_0.create_dt desc nulls last

 

@Formula 로 설정한 필드는 Criteriabuilder 나 BooleanBuilder 의 조건으로도 활용이 가능합니다.

 

앞에서 말했다시피 @Formula 는 subquery로 동작하기 때문에 성능상 이슈를 고려하여 사용해야 합니다.

반응형