728x90

QueryDSL 11

[JPA] Querydsl 에서 Fetch Join을 적용시키는 방법

문제 상황 Fetch join 은 한 번의 쿼리로 JOIN 대상 테이블 데이터까지 한 번에 가져오고 영속성 컨텍스트에 넣어주기 때문에 n+1 문제를 해결하기 위한 하나의 방법이다. 그래서 fetch join 을 적용하면 실제로 그렇게 되는지 확인해보고 싶었다. Querydsl QBook book = QBook.book; QPaper paper = QPaper.paper; List bookList = jpaQueryFactory .selectFrom(book) .join(book).on(book.id.eq(paper.id)).fetchJoin() .fetch(); 생성된 SQL SELECT book.id FROM book INNER JOIN paper ON (book.id=paper.id) SELECT p..

QueryDSL 2022.10.15

queryDsl로 like 문 구현

회원 페이지를 개발했는데 검색 기능이 필요하다. Querydsl의 like로 코드를 작성하고 확인해보니 컬럼의 풀텍스트가 일치하는 것만 출력이 된다. 앞뒤로 %를 붙이니 부분 텍스트만 입력해도 일치하는 것으로 리스트가 출력된다. contains는 어떨까 싶어서 확인해보니 %를 넣지 않아도 like에다가 %를 앞뒤로 붙인 것과 같은 결과가 출력된다. 차이를 레퍼런스를 통해서 확인했는데 둘 다 StringExpression 클래스에 속해있고 간단한 설명은 다음과 같다. query = query.where(qUserEntity.email.like(userEmail)); //지정된 str(userEmail)과 같으면 return query = query.where(qUserEntity.email.contains..

QueryDSL 2022.09.19

QueryDSL 페이징 방법

QueryDSL 에서의 페이징 -> offset과 limit를 통해서 페이징을 할 수 있다. LIMIT 숫자 : 출력할 행의 수 OFFSET 숫자 : 몇번째 row부터 출력할 지. (1번째 row면 0) 조회 건수 제한 @Test public void paging1() { List result = queryFactory .selectFrom(member) .orderBy(member.username.desc()) .offset(1) //offset은 0부터 시작(zero index), 현재 코드에서는 1번부터 데이터를 가져오도록 하므로 맨 처음 데이터는 생략됨 .limit(2) //최대 2건 조회 .fetch(); assertThat(result.size()).isEqualTo(2); } 전체 데이터 수..

QueryDSL 2022.07.16

동적 쿼리 - BooleanBuilder 사용

동적 쿼리를 해결하는 두가지 방식 BooleanBuilder Where 다중 파라미터 사용 @Test public void 동적쿼리_BooleanBuilder() throws Exception { String usernameParam = "member1"; Integer ageParam = 10; List result = searchMember1(usernameParam, ageParam); Assertions.assertThat(result.size()).isEqualTo(1); } private List searchMember1(String usernameCond, Integer ageCond) { BooleanBuilder builder = new BooleanBuilder(); if (userna..

QueryDSL 2022.06.25

(QueryDSL) 동적쿼리(feat. BooleanBuilder)

com.mysema.qeury.BooleanBuilder를 사용하면 특정 조건에 따른 동적 쿼리를 편리하게 생성할 수 있다. SearchParam param = new SearchParam(); param.setName("시골개발자"); param.setPrice(10000); QItem item = QItem.item; BooleanBuilder builder = new BooleanBuilder(); if (StringUtils.hasText(param.getName())) { builder.and(item.name.contains(param.getName())); } if (param.getPrice() != null) { builder.and(item.price.gt(param.getPrice()..

QueryDSL 2022.06.18

(JPA)프로젝션 feat.QueryDSL..

select 절에 조회 대상을 지정하는 것을 프로젝션이라 한다. 프로젝션이 하나면 아래 예제와 같이 해당 타입으로 반환한다. QItem item = QItem.item; //프로젝션 대상이 하나 List result = query.from(item).list(item.name); for (String name : result) { System.out.println("name = " + name); } 반면, 프로젝션 대상으로 여러 필드를 선택하면 QueryDSL은 기본으로 com.mysema.query.Tuple이라는 Map과 비슷한 내부 타입을 사용한다. 조회 결과는 tuple.get() 메소드에 조회한 쿼리 타입을 지정하면 된다. QItem item = QItem.item; List result = ..

QueryDSL 2022.06.18

QueryDsl 조인 종류

조인(Join)은 innerJoin(join), leftJoin, rightJoin, fullJoin을 사용할 수 있다. 추가로 JPQL의 on과 성능 최적화를 위한 fetch 조인도 사용할 수 있다. 조인의 기본 문법은 첫 번째 파라미터에 조인 대상을 지정하고, 두 번째 파라미터에 별칭으로 사용할 쿼리타입을 지정한다. join(조인대상, 별칭으로 사용할 쿼리 타입) QOrder order = QOrder.order; QMember member = Qmember.member; QOrderItem orderItem = QOrderItem.orderItem; query.from(order) .join(order.member, member) .leftJoin(order.orderItems, orderItem)..

QueryDSL 2022.06.17

페이징과 정렬(feat.queryDSL)

QItem item = QItem.item; query.from(item) .where(item.price.gt(20000) .orderBy(item.price.desc(), item.stockQuantity.asc()) .offset(10).limit(20) .list(item); 정렬은 orderBy를 사용하는데 쿼리 타입(Q)이 제공하는 asc(), desc()를 사용한다. 페이징은 offset과 limit을 적절히 조합해서 사용하면 된다. 실제 페이징 처리를 하려면 검색된 전체 데이터 수를 알아야 한다. 이때는 list() 대신에 아래 예제와 같이 listResults()를 사용한다. SearchResults result = query.from(item) .where(item.price.gt(10..

QueryDSL 2022.06.17

검색 조건 쿼리(feat. QueryDSL)

JPAQuery query = new JPAQuery(em); //검색 조건 쿼리 실행 QItem item = QItem.item; List list = query.from(item) .where(item.name.eq("좋은상품").and(item.price.gt(20000))) .list(item); //조회할 프로젝션 지정 select item --실행된 JPQL from Item item where item.name ?1 and item.price > ?2 QueryDSL의 where 절에는 and 나 or을 사용할 수 있다. 또한 다음처럼 여러 검색 조건을 사용해도 된다. 이때는 and 연산이 된다. .where(item.name.eq("좋은 상품"), item.price.gt(20000)) 쿼..

QueryDSL 2022.06.17
728x90