최다영 프로필

페이징 total count 분리 최다영 11시간 전

total count를 구하는 쿼리를 분리했을 때 페이징 쿼리는 어떻게 작성하는지.. 간단히 예를 들어주실 수 있으신가요?

2
Dongwoo Seo 프로필

Querydsl 빈 생성 3가지 방식 질문 Dongwoo Seo 17시간 전

안녕하세요.

강의 잘 듣고있습니다.

결과를 DTO 반환할 때 3가지 

1. 프로퍼티 접근(Setter)

2. 필드 직접 접근

3. Constructor

이렇게 있는데 각각의 장단점이 어떤건가요?

일반적으로 실무에서 1번을 사용하는게 맞는건지 궁금하네요.

1
Yong D 프로필

페치조인후 원하는 값만 가져오기 Yong D 5일 전

[코드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
JPAmericano 프로필

countQuery 최적화 부분 JPAmericano 8일 전

실무활용-스프링데이터jpa와 쿼리 dsl 챕터의, 

스프링데이터 페이징 활용2 - CountQuery 최적화 강의: 1분37초.

=========

 안녕하세요.

(강의 그대로 따라한것은 실습 잘 되었습니다.)

 해당 화면의 countQuery 최적화를 위해 코드 수정하는 부분에서,   강의에서는 total 변수에 할당하는 부분을 수정하셨는데,

 강의와는 다르게,  강의에서 고친 countQuery 변수와  기존의 total변수 부분을 상존하게 둔 뒤,  다음 강의의 rest-api 실습을 하면,  count 쿼리가 나가버립니다.

 물론, 강의대로 하면 count 쿼리가 안나가지만,  total 변수를 전혀 사용하지 않고,  다만 그대로 상존하게 두었을 뿐인데,  count 쿼리가 나가는 이유가 무엇일까요?   

 설마 return 문의 메서드에 countQuery.fetchCount() 가 나중에 호출될때,   total 변수에 할당된 코드의 마지막 .fetchCount() 부분도 실행되어버리는 버그일까요?   ( 다음강의의 실습에서 page=0, size=110 이라는 조건도 똑 같이 따라했습니다만..)

4
help 프로필

OneToMany 좋은 예제 help 12일 전

먼저 좋은 강의 감사합니다.

OneToMany 관계를 맺고있는 엔티티의 경우 JPA2 활용에서는 여러가지 방법으로 성능을 끌어올릴수있도록 하는 예제를 보여주셨는데 querydsl 로는 안보여주신것 같아요.

혹시 querydsl 을 사용해 OneToMany 관계의 엔티티를 모두 가져오는 좋은 방법이 있을까요.

1
bk11001 프로필

Join Update는 불가능한가요? bk11001 12일 전

예를 들어 

UPDATE A_Table

SET A_Column_01 = 'disable' FROM A_Table a INNER JOIN B_Table b ON a.A_Key = b.B_Key WHERE b.B_Key is NULL

이런식으로 특정 테이블과 조인하여 업데이트 하는 구분이 Querydsl에서 가능한지요?

동적인 조건으로 저런 상황이 필요할것같은데 찾아보니 없는것같아 문의드립니다.

감사합니다.

1
skkim13.dev 프로필

안녕 하세요 skkim13.dev 13일 전

궁금한게 있는데요

실무에서 entity랑 dto만 사용하시나요??

vo는 안쓰시구요??

1
@Todo 프로필

@QueryProjection과 fetch join @Todo 16일 전

List<ProjectionResult> fetch = queryFactory
.select(new QProjectionResult(classA.id,
classA.relStatus.stringValue(),
classA.relResult.stringValue(),
classA.name,
))
.from(classA)
.join(classA.classB, classB).fetchJoin()
.join(classB.classC, classC).fetchJoin()

안녕하세요. 

위와 같이 join fecth와 queryprojection을 같이 사용하는 예제에서 실행하면 

Caused by: org.hibernate.QueryException: query specified join fetching, 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,

와 같은 예외를 발생시킵니다. 

select(new QProjectionResult)가 아닌 select(classA)를 하면 정상적으로 결과가 처리되는데

어떤 차이가 있고 어떻게 해결을 해야 할까요 ?

감사합니다. 

1
@Todo 프로필

Multiple Datasource에서 QuerydslRepositoryService의 EntityManager @Todo 16일 전

안녕하세요. 

multiple datasource 환경에서 

EntityManager를 인젝션해서 사용하려면 @Qualifier로 직접 configuration 한 UserEntityManagerFactory를 명시를 해줘야 하는데 이를 회피할수 있는 방법이 있는가요 ?

config한 class에 @Primary를 해도 @Transactinal은 default로 지정이 되는데 EntityManager 인젝션은 안되네요. 

이것을 못해서 QuerydslRepositoryService 사용에 어려움이 있습니다. 

1
@Todo 프로필

Querydsl4RepositorySupport class Type 문의 @Todo 17일 전

안녕하세요. 

Querydsl4RepositorySupport class를 사용하실때 select와 from의 동일한 큐클래스타입을 사용하셨는데 select dto를 통한 조회시에도 사용가능한 방법이 있는가요 ?

1
@Todo 프로필

중첩된 fetch join @Todo 17일 전

안녕하세요

fetch 조인 문의가 있습니다. 

class A {
@ManyToOne
private B b;

@ManyToOne
private D d;
}

class B {
@ManyToOne
private C c;
}

class C {
...
}

class D {
...
}

A클래스를 조회하면서 관련된 연관관계인 B, C, D 를 모두 한번에 fetch 조인이 가능한가요 ?

안된다면 이런경우를 어떻게 해결하는지 문의 드립니다. 

감사합니다. 

4
Yong D 프로필

querydsl로 where in 절 표현하기 Yong D 17일 전

API 개발과 성능 최적화 강의 주문 조회 V5 JPA에서 DTO 직접 조회 - 컬렉션 조회 최적화 강의 를 보면서 

querydsl로 변환해 보는 공부를 하고 있습니다.

위의 코드에서 where in 절은 querydsl 로 어떻게 나타내야 하는지 궁금합니다 

2
a79007714 프로필

벌크 연산시 flush 호출 여부에 대해 궁금한 점이 있습니다. a79007714 20일 전

안녕하세요. 선생님 벌크연산 강의 중에 질문이 있습니다.

JPA 프로그래밍 책에서 JPQL 실행 시 플러시가 자동 호출되어서 영속성 컨텍스트에 있는 쿼리문이 db에 동기화 되는걸로 알고 있는데 벌크 연산은 update 쿼리이기 때문에 자동으로 플러시가 호출되지 않아서 강제로 플러시를 호출해줘야 되는건가요?   이 부분에 혼동이 있어서 질문드립니다.

1
Yong D 프로필

페치조인과 외부조인 Yong D 21일 전

페치조인을 해서 회원과 관련된 팀을 즉시로딩하는 것과 즉시로딩을 하는것과 

외부조인을해서 회원과 연관된 팀을 가져오는것의 차이는 무엇인가요?

---

1번 // 외부조인 사용

List<Tuple> result = queryFactory .select(member, team)

                                                      .from(member)

                                                     .leftJoin(team).on(member.username.eq(team.name))

                                                     .fetch();

2번 // 페치조인 사용

Member findMember = queryFactory .selectFrom(member)

                                                .join(member.team, team).fetchJoin()

                                                .where(member.username.eq("member1"))

                                                .fetchOne();

3
이충만 프로필

count 쿼리 관련 질문이 있습니다. 이충만 22일 전

강의 내용에서 벗어난 질문이라 죄송하지만

contentQuery 에서 leftJoin을 할 경우에 countQuery에서는 join을 생략하고 member만 조회해도 되지 않나요?

늘 좋은 강의 정말 감사하게 생각합니다! 감사합니다.

1
지식공유자 되기
많은 사람들에게 배움의 기회를 주고,
경제적 보상을 받아보세요.
지식공유참여
기업 교육을 위한 인프런
“인프런 비즈니스” 를 통해 모든 팀원이 인프런의 강의들을
자유롭게 학습하는 환경을 제공하세요.
인프런 비즈니스