작성
·
70
·
수정됨
0
영한님 안녕하세요
강의 잘 듣고 있는데, 서브쿼리를 사용하려다.. where, having절에만 사용가능하기에 이 문제를 어떻게 해결할까 고민하다가 질문드립니다..
<문제>
현재 엔티티는
Post(게시글) 엔티티 필드 : postId, content, createdAt , 조회수,댓글 수, 좋아요 수
Post view(게시글 조회) 엔티티 필드 : postViewId, user,post, 조회수,댓글수,좋아요수
이렇게 있습니다. ( post view 엔티티는 특정 유저그룹이 어떤 게시글을 본 히스토리를 관리하고 그 히스토리를 통해 게시글의 인기도를 측정하기 위함입니다.)
이러한 상황에서 ,
게시글의 조회수, 댓글 수, 좋아요 수, 특정 유저그룹이 해당 게시글을 조회한 수, 특정 유저그룹이 해당 게시글에 댓글 단 수, 특정 유저그룹이 해당 게시글에 좋아요한 수 로 정렬하고, (where 조건 절은 다 구현됐다는 가정)
groupby는 게시글의 pk 로만 하지만, 실제로 dto에 projections.bean()활용해서 매핑할 필드들은 content, createdAt 등 여러가지 컬럼이 추가로 있습니다.
이러한 경우라면, 우선 특정 유저그룹이 해당 게시글에 댓글 단 수, 특정 유저그룹이 해당 게시글에 좋아요한 수로 정렬하려면, 집계함수 sum을 활용해야하기 때문에 orderby절에 집계함수가 써야하고, 그러면 당연히 groupby를 써야하는데 이 때, post의 모든 필드들로 groupby 하는 것보다 pk로만 group by하는게 의미 있다고 생각해서 select 절에는 select postId 만 올 수 있을텐데
그렇다면 이 postId의 리스트를 받아서 다시 이 postId로 다시 post entity를 조회해서 나머지 content, createdAt 값을 받는것이 최선일까요?(이 방법도 그런데 정렬이 유지되지않아서 결국 다시 집계함수로 정렬해야만할까요?) 이렇게 하면 두 번 쿼리를 날리기 때문에 별로 좋지 않은 방법이지 않을까라는 생각이 들지만 jpa는 from 절 서브쿼리를 지원하지않고, 다른 방법이 떠오르지 않아 여쭤봅니다.
조금 중구난방으로 질문한 감이 없지 않아 있지만..
영한님 답변 부탁드립니다..ㅠㅠ
답변 1
0
안녕하세요. jayjoy05님
말씀하신 내용을 Querydsl로 작성하기는 쉽지 않을 것 같아요.
대안으로는
JPQL을 사용한다.
하이버네이트가 from절의 서브쿼리를 이제는 지원하는데요.
다음을 참고해주세요.
https://in.relation.to/2022/06/24/hibernate-orm-61-features/
NativeQuery를 사용한다.
정도가 있을 것 같아요.
참고로 모든 것을 JPQL, Querydsl로 해결하려기 보다는 쿼리 자체가 너무 복잡해지면 이런 경우에는 NativeQuery, JdbcTemplate 등도 함께 고려하는 것이 좋습니다.
감사합니다.