데이터베이스/JPA
[JPA]@Formula
뽀글이아저씨
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 에도 작동한다