• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

페치조인후 원하는 값만 가져오기

20.02.18 12:37 작성 조회수 440

1

[코드1: 페치조인후 원하는 컬럼만 추출하는 쿼리dsl, 동작은 하지만 원하는 결과를 도출해내지 못하는 코드]
List
<OrderSimpleQueryDtoresult=
        qf.select(Projections.bean(OrderSimpleQueryDto.class
            ,QOrder.order // 이 코드를 넣어야 결과가 나옵니다
            ,QOrder.order.id
            ,QOrder.order.orderDate
            ,QOrder.order.status
            ,QOrder.order.member.name
            ,QOrder.order.delivery.address 
           
        ))
        .from(QOrder.order)
        .join(QOrder.order.memberQMember.member).fetchJoin()
        .join(QOrder.order.deliveryQDelivery.delivery).fetchJoin().fetch();
}
[코드2: DTO 클래스 정의]
@Data
@NoArgsConstructor
public class OrderSimpleQueryDto {
    private Order order; //QOrder.order 를 받기 위한 코드
    private Long id;
    private LocalDateTime orderDate
    private OrderStatus status;
    private String name;
    private Address address;
}
[코드1 의 쿼리결과 : QOrder.order 를 넣으면 나오는 결과, 원하지 않는 컬럼까지 가져오게 됩니다 ]
select order0_.order_id as col_0_0_, order0_.order_id as col_1_0_
, order0_.order_date as col_2_0_, order0_.status as col_3_0_
, member1_.name as col_4_0_, delivery2_.city as col_5_0_, delivery2_.street as col_5_1_
, delivery2_.zip_code as col_5_2_, member1_.member_id as member_i1_4_1_
, delivery2_.delivery_id as delivery1_2_2_, order0_.order_id as order_id1_6_0_
, order0_.delivery_id as delivery4_6_0_, order0_.member_id as member_i5_6_0_
, order0_.order_date as order_da2_6_0_, order0_.status as status3_6_0_
, member1_.city as city2_4_1_, member1_.street as street3_4_1_
, member1_.zip_code as zip_code4_4_1_, member1_.name as name5_4_1_
, delivery2_.city as city2_2_2_, delivery2_.street as street3_2_2_
, delivery2_.zip_code as zip_code4_2_2_
, delivery2_.status as status5_2_2_
from orders order0_
inner join member member1_ on order0_.member_id=member1_.member_id
inner join delivery delivery2_ on order0_.delivery_id=delivery2_.delivery_id
select
order0_.order_id as col_0_0_,
order0_.order_id as col_1_0_,
order0_.order_date as col_2_0_,
order0_.status as col_3_0_,
member1_.name as col_4_0_,
delivery2_.city as col_5_0_,
delivery2_.street as col_5_1_,
delivery2_.zip_code as col_5_2_,
member1_.member_id as member_i1_4_1_,
delivery2_.delivery_id as delivery1_2_2_,
order0_.order_id as order_id1_6_0_,
order0_.delivery_id as delivery4_6_0_,
order0_.member_id as member_i5_6_0_,
order0_.order_date as order_da2_6_0_,
order0_.status as status3_6_0_,
member1_.city as city2_4_1_,
member1_.street as street3_4_1_,
member1_.zip_code as zip_code4_4_1_,
member1_.name as name5_4_1_,
delivery2_.city as city2_2_2_,
delivery2_.street as street3_2_2_,
delivery2_.zip_code as zip_code4_2_2_,
delivery2_.status as status5_2_2_
from
orders order0_
inner join
member member1_
on order0_.member_id=member1_.member_id
inner join
delivery delivery2_

[코드1에 QOrder.order 를 넣지 않으면 나오는 에러 코드]
but the owner of the fetched association was not present in the select list
[FromElement{explicit,not a collection join,fetch join,fetch non-lazy properties
,classAlias=member1,role=com.jayden.shop.domain.Order.member,tableName=member
,tableAlias=member1_,origin=orders order0_,columns={order0_.member_id
,className=com.jayden.shop.domain.Member}}]
at org.hibernate.hql.internal.ast.tree.SelectClause.initializeExplicitSelectClause(SelectClause.java:217)

---
[내용 설명]
원하는값만 DTO로 받을수 있는 개발자님의 강의를 보고

페치 조인후에 원하는 컬럼만 얻는 코드를 시험삼아 진행해봤는데 오류가 발생했습니다

에러코드를 해석하니깐 페치의 주인이 select 절에 없기 때문에 에러가 발생한다고 해석했고
페치의 주인이 QOrder.order 인거 같아서
select 절에 QOrder.order 자체를 넣어줬더니 성공했습니다
하지만 제가 원하지 않는 컬럼(예를 들면 Member 엔티티의 Address) 까지 가져오게 되는 현상이 발생했는데
어떻게 해야 할까요?

답변 1

답변을 작성해보세요.

2

안녕하세요. Yong D님

다음 질문을 참고해주세요^^

https://www.inflearn.com/questions/23847