728x90

querydsl 18

4) Querydsl 설정

Querydsl 설정 아래 내용은 https://github.com/beaver84/setting-test 에서 실제 소스를 확인할 수 있습니다. JPA 설정에 이어서 편리한 기능을 제공하는 Querydsl 설정을 추가한다. 우선, build.gradle 에 라이브러리를 추가 후, gradle을 새로고침을 한다. //Querydsl 버전 관련 buildscript { ext { queryDslVersion = "5.0.0" } } plugins { ... //Querydsl 관련 추가 id 'com.ewerk.gradle.plugins.querydsl' version '1.0.10' ... } dependencies { ... //Querydsl 관련 실제 lib 추가 implementation "com..

[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

INNER JOIN, LEFT JOIN, RIGHT JOIN의 차이

예제 테이블 mysql> select * from demo_people; name phone pid Mr brown 01225 708225 1 Miss Smith 01225 899360 2 Mr Pullen 01380 724040 3 mysql> select * from demo_property; pid spid selling 1 1 Old House Fram 3 2 The Willows 3 3 Tali Trees 3 4 the Melksham Florist 4 5 Dun Roamin 1. 기본 JOIN (= INNER JOIN) - 기본적으로 JOIN은 교집합이다. select name, phone, selling from demo_people join demo_property on demo_peopl..

Database 2022.07.17

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
728x90