• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

안녕하세요 질문드립니다.

20.12.01 17:19 작성 조회수 78

0

안녕하세요. 영한님 덕분에 강의를 시청하고 jpa로 프로젝트를 진행하고있습니다.

현재 "User"객체, "Movie" 객체 그리고 "Score" 객체로

Movie <1 : N>  Score <N : 1> User

이런식으로 유저가 영화에 부여한 평점에 대해  관계를 맺고있습니다.

이제 여기서 평점이 특정 점수 이상인 영화목록을 평점과 함께 가져오려고합니다

select

        movie0_.content_id as content_2_5_,

        movie0_1_.category as category3_5_,

        movie0_1_.description as descript4_5_,

        movie0_1_.dtype as dtype1_5_,

        movie0_1_.main_title as main_tit5_5_,

        movie0_1_.image_id as image_id7_5_,

        movie0_1_.production_date as producti6_5_,

        movie0_.book_rate as book_rat1_11_,

        movie0_.country_code as country_2_11_,

        movie0_.netflix_yn as netflix_3_11_,

        movie0_.watcha_yn as watcha_y4_11_,

        movie0_.origin_title as origin_t5_11_,

        movie0_.running_time as running_6_11_,

        movie0_.total_audience as total_au7_11_ 

    from

        movie movie0_ 

    inner join

        content movie0_1_ 

            on movie0_.content_id=movie0_1_.content_id 

    where

        (

            select

                avg(score1_.score) 

            from

                score score1_ 

            where

                movie0_.content_id=score1_.content_id

        )>=4.0 limit ?

대충 이런 쿼리로 생각하고있습니다.

근데 점수(score)를 중간 테이블로 분리하다보니 이걸 dto에 맵핑하는 과정에 좀 고민되는 부분이 있습니다.

Movie 엔티티에 averageScore라는 컬럼을 넣을순없으니 이걸 어떻게 해야하나 싶은데

1.  jpql로 순수한 Movie엔티티를 먼저조회하고 그 정보를 가지고 영화들의 평균점수를 조회한뒤 합친다.

이렇게하면 영화조회할때 avg(score) 비교연산 하는부분의 서브쿼리를 평균점수 조회때 한번 더 돌려야합니다.

그리고 가져온뒤 pk값으로 맵핑을 일일이해줘야하는데 jpa가 해야할일을 제가하는 느낌입니다.

2. jpql로 애초에 DTO로 맵핑하게끔해서 한번의 조회로 끝낸다.

근데 뭔가 jpql에서 바로 DTO로 조회하는게 탐탁치않습니다.

3. 네이티브쿼리를 쓴다.

제일 간단한 방법인데 사실상 2번 방법이랑 비슷한거 같네요.

어떤게 가장 jpa스러운 해결방법인지, 사실 위에 3개다 별로인거같아서 여쭤봅니다.

감사합니다.

답변 1

답변을 작성해보세요.

0

안녕하세요. kd park님

집계나 통계성 쿼리 같은 경우에는 순수한 엔티티로 조회하기가 쉽지 않습니다. 그리고 그게 꼭 올바른 방향도 아니구요.

집계나 통계성 쿼리는 이미 엔티티를 한번 가공해서 다른 데이터로 변해버린 데이터입니다. 따라서 DTO로 조회하는 것이 더 나은 선택일 확율이 높습니다.

선택하는데 도움이 되셨길 바래요^^