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를 활용한 여러글들
'데이터베이스 > JPA' 카테고리의 다른 글
[JPA] 변경 감지와 병합(Merge) (0) | 2023.04.22 |
---|---|
[JPA] Entity Lifecycle Events (0) | 2022.12.31 |
[JPA] JPQL @Query에 각 DB function() 사용해보기 (0) | 2022.12.31 |
[JPA] Pageable과 countQuery 사용한 Spring-Data FETCH JOIN (0) | 2022.11.24 |
[JPA] Fetch 전략과 @EntityGraph로 n+1 해결하기(2) (1) | 2022.08.04 |