30%
61,600원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결실전! Querydsl
Querydsl의 사용
강의를 듣다가 문득 궁금한 점이 생겨 질문드립니다. 실무에서는 Querydsl을 사용하여 대부분의 쿼리를 작성하나요? 아니면 스프링 데이터 jpa와 조합하여 사용하나요? ex: 스프링 데이터 jpa로 간단히 구현가능한 쿼리는 스프링 데이터 jpa를 쓰고 검색 기능과 같은 동적쿼리가 필요한 부분만 Querydsl을 사용하는지??
- 미해결실전! Querydsl
Projection 과 Tuple의 사용 질문 드립니다.
안녕하세요. 강의내용중 projection과 Tuple사용과 관련하여 질문이 있습니다. 목표 : 아래 코드와 같은 결과값을 가지고 json 응답을 보내주려고 한다면 select (select count(1) from Atable) as totalCnt, (select sum(Atable.column_a))from Atable 질문 : ..........해당 ~ReporitoryImpl 클래스 ...@Overridepublic List<TableDto> info() { return queryFactory .select(new TableDto( Atable.count(), Atable. column_a.sum())) .from(Atable) .fetch();} 위와 같이 TableDto 클래스를 따로 만들어서 원하는 두 값만 projection해서 가져오는게 맞을까요? 그게 아니라면 return 을 List<TableDto>가 아니라 List<Tuple>로 바꾼 후에, queryFactory 코드쪽에서 서브쿼리를 사용하는게 맞을까요? 첫번째 방법을 사용하자니, TableDto를 만들때 해당 테이블의 특정 컬럼만 멤버변수로 사용하는게 아니라서 뭔가 좀 표준이 아닌것 같고, 두번째 방법을 사용하자니, queryFactory의 fetch 결과가 여러개가 나올뿐더러 (물론 limit(1)을 쓰면 되긴하지만...) List<Tuple> 결과값을 Service단에서 받아서 뽑아내서 쓰자니 코드도 길어지고 ,Tuple은 Repository에서만 사용하는게 좋다고 들은것 같아서 이렇게 사용하기 좀 애매해서요. 어떤 방법이 정석인지 궁금합니다. 감사합니다.
- 미해결실전! Querydsl
group by 결과에 대한 질문입니다.
안녕하세요 영한님 강의 재밌게 잘 듣고 있습니다. 간단한 질문이 있습니다~! group by를 한 다음에 Tuple teamA = result.get(0); 으로 알려주셨는데 0번 index로 가져온 결과값이 Team B가 아니라 Team A에 관한 집계 결과를 보장하는지 궁금합니다. (내부적으로 정렬 같은 방식이 일어나는건가요..??ㅎㅎ)
- 미해결실전! Querydsl
복수의 엔티티를 join 할때의 질문입니다.
제목 그대로 만약 member 엔티티와 연관된 엔티티가 team 말고도 group 이라는 엔티티가 있다면 .select() .join(member.team, team) .on(...) .join(member.group, group) .on(...) .fetch(); 처럼 하고 성능 최적화를 위해 team 엔티티만 페치조인 하고자 한다면 해당 조인에만 .fetchjoin() 메서드를 붙이면 되는것이 맞나요?
- 미해결실전! Querydsl
패치조인시 패치조인 대상 entity 검색조건 걸시 값 바인딩이 되지 않음.
아래와 같이 값 바인딩이 되지 않고 있습니다. where customer3_.cu_cph like ? escape '!' where customer3_.cu_cph like '' escape '!';
- 미해결실전! Querydsl
벌크연산 관련 질문드립니다
안녕하세요 강사님. 강의 듣다가 의문점이 하나 있어서 질문드립니다. bulk update 후 동일 트랜잭션 내에서 엔티티를 조회했을때 영속성 컨텍스트에 update 결과가 반영안되는것까진 확인했습니다. 그런데 bulk delete 후에 엔티티를 조회하면 delete 결과가 반영이 되어있더라고요. (27강 12분 25초 delete문을 날린 후 Member 조회시 1개가 나옵니다) 그 이유가 궁금합니다. 결국 벌크연산에서 update문만 조심하면 되는건가요?
- 미해결실전! Querydsl
caseBuilder otherwise
삭제된 글입니다
- 미해결실전! Querydsl
JPAQueryFactory를 필드로 제공하는 경우
new JPAQueryFactory(em)을 굳이 @BeforeEach에 포함시켜야 할까 생각이 들어 코드를 다음과 같이 수정해봤는데요. @AutowiredEntityManager em;JPAQueryFactory queryFactory = new JPAQueryFactory(em);@BeforeEachpublic void before() {// queryFactory = new JPAQueryFactory(em); 그리고 테스트를 실행하면 queryFactory.select(m) 부분에서 NullPointException이 발생합니다. 제 생각에는 EntityManager가 스프링 빈으로 등록되기 전에 new를 통해 JPAQueryFactory를 생성하려 하니 문제가 생겼다고 생각했는데 맞을까요? 아니라면 어떤 이유로 exception이 생기는지 여쭙고 싶습니다:)
- 미해결실전! Querydsl
intelliJ 에서 Q 파일이 아래 그림처럼 생성이 됩니다.
안녕하세요. 강의 여러번 잘 듣고 있습니다. 실무에서 querydsl 을 적용해서 사용해보고 있는데 intelliJ 에서 아래 그림처럼 Q 파일이 생성되는 문제가 있네요. maven clean package 하게 되면 최초는 깨끗하게 생성되는데 코딩을 진행하다 보면 어느 순간에 보면 동일한 이름의 class가 넘버링되서 자동 생성이 되어 버립니다. 혹시 이런 문제 겪어본적 없으신가요?
- 미해결실전! Querydsl
lazy loading 할 때 where 절 추가 관련 질문드립니다.
안녕하세요. OneToMany 가 여러개 있는 entity 를 페이징으로 가져오려고 하는 상황에서 default_batch_fetch_size 를 100 이상으로 설정해서 in query 로 가져오게 구성해놓았습니다. 이 때 lazy loading 으로 in query 호출 시 추가 where 조건을 넣어서 가져오고 싶은데요. 단 하나 가능한 케이스를 찾은건.. entity 클래스에 @Where 어노테이션을 달아서 처리하면 lazy loading in query 와 함께 명시한 where 절이 호출되는건 확인했습니다만, 이렇게 설정하면 관련된 모든 쿼리의 where 절에 추가될 수 있어서.. 특정 querydsl 로 호출 시에만 lazy loading 호출 시 where 조건을 추가하고싶습니다. 많이 검색해보면서 삽질해봤는데.. 딱히 방법이 보이지 않는 것 같은데요 ㅠㅠ 혹시 방법이 있을까요? 미리 감사합니다
- 미해결실전! Querydsl
JPAQueryFactory 필드 이동 오류 관련 질문입니다
강의를 보고 JPAQueryFactory를 필드로 옮겼을때 nullpointexception이 뜹니다. JPAQueryFactory를 startQuerydsl 메소드 안으로 옮기면 괜찮습니다. 강의 내용에서 필드로 옮기는 것이 가능하다고 하셨는데, 이 경우에는 어떻게 해야하는지 궁금합니다
- 미해결실전! Querydsl
fetch join시 where관련해서 질문드립니다.
안녕하세요 ! 이번에 기본편을 제외한(기본편은 책으로 했습니다 !) 강사님 강의를 완강하고 jpa활용 1편 애플리케이션을 스프링데이터jpa와 queyrdsl을 활용해서 혼자 만들어보고 있습니다. 그 중에 주문 목록 검색 시, 주문자나 주문상태로 검색하는것을 querydsl로 짜봤습니다. package com.example.springjpa.repository; import com.example.springjpa.domain.*; import com.querydsl.core.BooleanBuilder; import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.jpa.impl.JPAQueryFactory; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; import javax.persistence.EntityManager; import java.util.List; import java.util.function.Supplier; import static com.example.springjpa.domain.QDelivery.delivery; import static com.example.springjpa.domain.QMember.member; import static com.example.springjpa.domain.QOrder.order; @Repository @Transactional public class SearchQueryRepository { private final EntityManager em; private final JPAQueryFactory queryFactory; public SearchQueryRepository(EntityManager em){ this.em = em; queryFactory = new JPAQueryFactory(em); } public List<Order> findAllByEntity(OrderSearch orderSearch){ List<Order> query = queryFactory.select(order) .from(order) .join(order.member, member).fetchJoin() .join(order.delivery, delivery).fetchJoin() .where(orderStatusEq(orderSearch.getOrderStatus()), membernameEq(orderSearch.getMemberName())) .fetch(); return query; } private BooleanBuilder orderStatusEq(OrderStatus orderStatus) { return nullSafeBuilder(()->order.status.eq(orderStatus)); } private BooleanBuilder membernameEq(String memberName) { return nullSafeBuilder(()->member.name.contains(memberName)); } public static BooleanBuilder nullSafeBuilder(Supplier<BooleanExpression> f) { try { return new BooleanBuilder(f.get()); } catch (Exception e) { return new BooleanBuilder(); } } } 본래 fetch join시 루트엔티티말고 조인하는 entity를 where로 검사하면 데이터 부정합이 생길수 있다고 하셨는데요 위의 경우 order와 member, delivery는 외래키가 있으니, 부정합이 일어날것 같지 않은데, 혹시 저게 옳은 코드일까요? 테스트를 돌려봤을때는 이상이 없습니다만 ㅠㅠ 아무리 생각해도 fetch join되는 테이블에 조건을 거는게 꺼림직해서.... 고민이 됩니다. 그냥 join으로 조회한 다음 dto에서 order.getDelivery().getAddress() 등을하는게 더 옳은 선택일까요?
- 미해결실전! Querydsl
질문있습니다.
삭제된 글입니다
- 미해결실전! Querydsl
count query 부분 질문이 있습니다.
localhost:8080/v3/members/?page=0&size=110 또는 page=2&size=40 으로 조회했을 때에는 카운트 쿼리가 실행되지 않는 걸 확인 했습니다. 페이지 시작이면서 컨텐츠 사이즈가 페이지 사이즈보다 작을 때 마지막 페이지 일 때 (offset + 컨텐츠 사이즈를 더해서 전체 사이즈 구함) 이 두 경우는 이해를 했는데(1번의 경우 시작이면서 마지막 페이지니까) page=1&size=110 또는 page=2&size=50 으로 조회할 경우 content.size()가 0인데도 카운트 쿼리가 실행됩니다. 메소드에서 size가 0이면 카운트 쿼리를 날리게 구현한 걸 봤지만 왜 이렇게 해뒀는지 도저히 상상이 안되네요. 이유를 알 수 있을까요? 허접한 질문이라 죄송합니다... 아직 부족한 게 많네요 ㅠㅠ
- 미해결실전! Querydsl
@Commit 에 대해
안녕하세요 저 선생님 궁금한게 하나 있어서 질문 올립니다. yml 파일에 ddl-auto : create 로 두고 @Rollback(value = false) 과 @Commit 의 차이점을 모르겠습니다. 물론 Rollback 의 개념과 Commit 의 개념은 알지만 둘다 같은 결과를 출력해서 질문 드려 봅니다.
- 미해결실전! Querydsl
주간 집계 쿼리 작성방법
주간 집계 sql문을 작성하고 있는데 SELECT DATE_FORMAT(DATE_SUB(`reg_date`, INTERVAL (DAYOFWEEK(`reg_date`)-1) DAY), '%Y/%m/%d') as start, count(`value`) as count, `flag` FROM `test_st` WHERE `reg_date` BETWEEN "2021-03-04 00:00:00" AND "2021-04-04 23:59:59" GROUP BY start, flag; 위와 같이 쿼리를 작성 하였습니다. 위와 같이 주간 집계 요구사항이 들어 왔을 경우에는, 어떤 방식으로 쿼리를 작성하고, application에서 로직 처리를 해야하는지 궁금합니다.
- 미해결실전! Querydsl
영한님 정렬 질문 있습니다!
pageable 객체로 Sort값을 가져왔을 때,querydsl 에서 Sort값을 바로 사용하는 방법은 없을까요? 직접 조건을 만들어서 사용하는 방법 뿐인가 의문이 들어 질문남깁니다! 좋은 인강들 올려주셔서 감사합니다
- 미해결실전! Querydsl
안녕하세요. 리턴 타입 질문 드립니다.
조회시에 List가 아닌 set 으로 리턴 하는 방법이 있나요? ex) public Set<Long> findByNamesIn(List<String> name) { return jpaQueryFactory .select(member.id) .from(member) .where(member.name.in(name)) .fetch(); // set return}
- 미해결실전! Querydsl
DTO안에 컬렉션이 있는 경우
안녕하세요 Dto안에 컬렉션이 있는 경우는 어떻게 사용할 수 있을까요? 예를 들어 team 엔티티를 dto로 조회하는데 teamDto 안에 List<memberDto>가 있는 경우는 어떻게 querydsl에서 지원하는지 궁금합니다
- 해결됨실전! Querydsl
hibernate proxy 관련 문제입니다.
onetomany relationship 에 있는 wsi, record 엔티티들이 존재하며 lazy loading입니다. 위 코드에서 wsi 리스트를 호출하게 되면 제 생각으로는 records 에 대한 프록시 객체가 생성되야서 records 라는 필드가 null이 아니여야 하는데 null이 됩니다.. 왜그럴까요. @Test fun findLatestByWsiIdTest() { val em = entityManager.createEntityManager() val tx = em.transaction tx.begin() createDummyData() em.flush() em.clear() val allProjectIdList = projectRepository.findAll().map { it.id!! } em.clear() println("********************* start ***************************") allProjectIdList.forEach { id -> run { val wsiList = wsiRepository.findAllByProjectId(id) //.map { it.id!! } println("each wsis of project size : ${wsiList.size}") wsiList.forEach { wsi -> run { println(wsi.records?.size) } } } } println("********************* end ***************************") tx.rollback() }