JPA Entity fake dual table join

jpa에는 dual 이 지원되지 않는데 , 어찌 해야되나..

Image for post
Image for post

주문테이블에 A라는 주문데이터가 생기고
A라는 주문 데이터가 취소 되면 주문취소 테이블에 데이터가 쌓인다.
(주문과 주문취소는 1:1관계 )

정산목록에서는 A라는 주문에 대한 노출을 (주문건 , 주문+취소건) 으로 최대 2개 row가 노출될수 있다.

A 주문 30000원
A 주문 15000원 취소

이렇게 주문 한건당 최소 1row,최대 2row를 노출해야하는 요건이 생겼다.

native query로 해버리면 간단하다
union 으로 합쳐도 되고 2row를 갖는 가상테이블로 join해도 된다.

굳이 jpa로 처리 해야되는지 고민에 고민..
jpa를 이해해볼겸 꼼수를 쓰더라도 해보자는 생각에 도전.

… 꼼수처리중.

우선 결론을 말하자면, 꼼수를 통해 일단 원하는 결과물을 만들었다.

일단 JPA 에 관리되는 Entity 로 dual테이블을 만들어야 된다.

Image for post
Image for post

보면 알겠지만. @Table에 지정한 name이 요상하다..

테이블명이 들어가야할 자리에 .. 인라인 뷰가 존재한다.
설명을 하자면 2개 row가 만들어지는 인라인뷰를 테이블네임으로 지정함으로써 , jpa/hibernate 를 통해 처리될때
, 2row를 생성하는 인라인뷰를 테이블명으로 하여 sql이 작성된다.

관계가 전혀 없기 때문에 queryDsl로 처리할때 약간 해맸다.
JpaQueryFactory.from(EntityPath<?> … path)
로 관계가 없는 entity 도 join이 가능하다.

1:2 조인으로 주문데이터는 두배 뻥튀기 된다.

Image for post
Image for post

끝.

위의 query를 만들기 위한 꼼수 처리였다.
이렇게 하는 방법이 .. JPA 사상에 맞지는 않는것 같다… ( ㅠ .. ㅠ )

*

공들인 꼼수는 기록하기 위해 .. 정리하였다.
(잊어버리는게 나을지도… )

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store