본문 바로가기

백엔드/QueryDSL

QueryDSL - 동적 쿼리 BooleanBuilder @Test public void dynamic1() { List members = searchMember(null, 15); for (Member member1 : members) { System.out.println("member1.getUsername() = " + member1.getUsername()); } } private List searchMember(String username, Integer age){ BooleanBuilder builder = new BooleanBuilder(); if (username != null) builder.and(member.username.eq(username)); if (age != null) builder.and(member.. 더보기
QueryDSL 프로젝션, DTO 사용 프로젝션 특정 필드만 조회할 경우 해당 필드의 타입 리스트가 반환값이 된다. 만약 조회하는 필드가 두개 이상이라면 이렇게 튜플이 된다. 튜플은 쿼리dsl에서 제공해주는 것이다. 그러므로 레포지토리 계층에서만 사용할 수 있도록 해야한다. DTO를 사용한 프로젝션 튜플을 레포지토리 계층에서만 사용하기 위해서는 서비스 계층으로 값을 반환할때 DTO를 사용해야 한다. JPA에서 공부했던 JPQL 쿼리를 DTO로 조회할 때를 잠깐 복습해보면 @Test public void projectionWithDTO() { List resultList = em.createQuery("select new study.QueryDSL.dto.MemberDTO(m.username, m.age) from Member m", Membe.. 더보기
쿼리 dsl 기초 QType 쿼리dsl 컴파일러가 실행되면 엔티티들을 대상으로 QType 클래스들을 만든다. 쿼리 dsl에서는 이 QType 클래스를 대상으로 쿼리를 만들어낸다. Q클래스 인스턴스의 사용법 2가지 QMember qmem = new Qmember("m"); // 별칭을 주며 직접 생성하기 QMember qmem = QMember.member; 싱글톤으로 구현된 기본 인스턴스 사용하기 1번 방법은 직접 별칭을 주는 것이고 2번의 방법은 기본값을 사용하는 것이다. 해당 QType 인스턴스를 대상으로 쿼리를 생성하면 아래와 같은 쿼리가 생긴다. 위에서 Qtype의 별칭은 sql로 번역이 될때 테이블 별칭을 말한다. 다양한 쿼리 Qtype 인스턴스가 제공해주는 다양한 함수들을 통해 where에 여러 조건을 주는 것.. 더보기
쿼리 dsl 입문 쿼리 dsl 쿼리 dsl은 쿼리를 자바 코드로 작성할 수 있도록 해준다. 이를 통해 아래 두가지 이점을 얻을 수 있다. 1. 컴파일 시점에 문법 에러를 잡아줌 2. 동적 쿼리 문제 해결! 쿼리 dsl은 jpql의 빌더 역할을 한다. 쿼리 dsl 코드는 결국 jpql로 번역된다. 앞서 jqpl에는 몇가지 불편사항, 문제점이 있었다. String name = "james"; em.createQuery("select m from Member m where m.name = :name", Member.class) .setParameter("name",name).getResultList(); 쿼리에 오타가 있을 경우에 잡아내지 못한다. (jpql 처음 사용해서 개발할 때에 이걸로 시간 엄청 까먹었다...) Stri.. 더보기