article thumbnail image
Published 2023. 2. 5. 16:20

Hiberante에서 제공하는 @Formula 어노테이션을 사용하면 가상 컬럼을 만들수 있다고 한다. 
가상컬럼이라는 것은 JPA 상에는 존재하지만 DB에는 생성되지 않는 칼럼을 말한다. 
주의해야 할 점은 하이버네이트 문서에도 언급되어 있지만 네이티브 SQL을 사용한다는 것이다.
 때문에 RDBMS의 종류를 교체하는 경우 호환성에 문제 가 있을 수도 있다.


언제 사용하는가?

예제들을 보면 댓글 개수구하기, 좋아요 개수구하기, 글자수 구하기등 무언가를 카운팅할 때 주로 사용하는 것으로 보인다.

 

 

사용법

사용법은 매우 간단하다 Entity 필드에 @Formula(쿼리)를 달아주면 된다.

    //댓글 개수
    @Formula("(SELECT count(1) FROM reply r WHERE r.boardId = id)")
    private int replyCount;
    
     //좋아요 개수
     @Formula("(select count(1) from heart he where he.post_id = id)")
     private int totalHeartCount;
     
     //코드 길이
     @Formula("LEN(code)")
     @Basic(fetch = FetchType.LAZY)  // 패치전략을 이용할 수 있다.
     private Long codeLength;
     
  • 마지막 코드 길이를 보면 LAZY를 사용한 것을 볼 수 있다. 항시 조회할 때마다 코드가 실행되는 것이 아니라 필요할 때만 사용할 수 있도록할 수 있다.
  • 하지만 DB에는 적재되지 않는다 단지 조회용도록 사용이 가능한걸로 알고 있다. 위 코드의 Entity가 user라면 user를 조회할 때 같이 실행된다. 물론 exists, count 에도 작동한다

 

 

@Formula를 활용한 여러글들

복사했습니다!