-
jpa또는 querydsl로 union 쿼리 사용개발/Spring 2021. 2. 25. 18:55
보통 jpa로 불러오다가 좀 더 세밀한 쿼리가 필요하면 querydsl을 사용한다.
이번에 기존 테이블과, 이 테이블의 데이터를 백업한 두 테이블 데이터를 함께 불러와야하는 일이 생겼다.
union 쿼리를 사용하면 되는데
jpa에서도,
querydsl에서도union은 지원하지 않는다.(아마 제대로 설계했다면 유니온이 왜 필요해? 라고 되묻는 것 같다.)
그래서 native query로 직접 입력 할 수밖에 없었다.
그래서 모습은
@Query(nativeQuery = true, value = "select * from (" + "select a.id, a.field1, a.field2 from test_tableA a where a.status =?1 union " + "select b.id, b.field1, b.field2 from test_tableB b where b.status =?1) d order by id", countQuery = "select * from (" + "select a.id, a.field1, a.field2 from test_tableA a where a.status =?1 union " + "select b.id, b.field1, b.field2 from test_tableB b where a.status =?1) d order by id") Page<Map<String, Object>> findDataByStatus(String status, Pageable pageable);
와 같은 모습이된다.
Paging을 위해 countQuery까지 넣었지만 필요없다면 countQuery와 pagable를 빼면 된다.
일반 쿼리처럼 작성하면 결과값을 얻을 수 있는데 결과값을 받을때 위와같이 Map이나 string, string[] 으로 받을 수 있기 때문에
편한 값으로 받아서 objectmapper를 통해 해당 객체에 편하게 넣을 수 있다.
위와같이 map으로 받을 시 문제점이 하나 있었는데
데이트 값이 epoch타임으로 넘어 온다는 것이다.
때문에 나는 해당 Deserializer를 생성하여 매칭하여 값을 넣었다.
추가
querydsl 에서 union 메서드를 사용하여 해결할 수도 있다.
https://www.tabnine.com/code/java/methods/com.querydsl.sql.SQLQuery/unionAll
'개발 > Spring' 카테고리의 다른 글
spring transaction (0) 2021.04.06 junit5 에러 테스트 (0) 2021.03.21 RequestBody의 데이트 타입 정해진 format으로 받기 (0) 2021.02.24 jpa entity 기본 생성자(Default Constructor) 필요할때 (0) 2020.03.10 webclinet 응답 객체 다루기 (json 객체) (0) 2020.03.06 댓글