스프링/QueryDsl 16

[QueryDsl] QuerydslRepositorySupport 개선하여 더 쉽고 간결하게 Repository에서 Querydsl 사용하기 (Querydsl4RepositorySupport)

기존의 QueryDsl을 편하게 사용하기 위해 구현된 QuerydslRepositorySupport를, 직접 구현하여 더 강력한 기능을 가진 Querydsl4RepositorySupport를 제작하자. QuerydslRepositorySupport 기본 abstract 클래스란? @Repository public abstract class Querydsl4RepositorySupport Impl 객체들에 QueryDsl 사용을 서포팅 해주는 추상클래스이다. QuerydslRepositorySupport 기본 적용법 public class MemberTestRepository extends QuerydslRepositorySupport { public MemberTestRepository() { super..

스프링/QueryDsl 2022.03.23

[QueryDsl] QueryDsl + Paging & CountQuery 최적화

SpringData의 Page 인터페이스와 Pageable 인터페이스, 그리고 Page 구현체 public PageImpl(List content, Pageable pageable, long total) PageableExecutionUtils.getPage(content, pageable, countQuery::fetchOne) 로 경우에 따라 Count쿼리 최적화 를 사용한다. count 분리 안하고 한번에 조회 Pageable interface로 page,size,sort를 자동 매핑하여 사용하게 하고, getOffset(), getPageSize() 등으로 꺼내 queryDsl의 offset,limit 메서드등에 인자로 넣어준다. Page 객체로 return해주기 위해 PageImpl(실 retu..

스프링/QueryDsl 2022.03.22

[QueryDsl] SpringDataJPA (Interface)에 원하는 QueryDsl method 추가하기

SpringDataJPA는 interface로 상속받아 구현하는데, QueryDsl 메서드를 추가하려면 구현체가 필요하다. 기본적인 SpringDataJPA를 상속받은 interface Repository public interface MemberRepository extends JpaRepository { //select m from Member m where m.username = ? List findByUsername(String username);//naming 규칙으로 추가한 method } 그렇다면, 이 SpringDataJPA interface에 queryDsl 메서드를 추가하려면 어떻게? 🎁interface는 상속이 무한이라는 점을 이용한다. 방법 1. SpringDataJPA interf..

스프링/QueryDsl 2022.03.22

[QueryDsl] SpringDataJPA가 제공하는 QuerydslPredicateExecutor 인터페이스 사용해서 간단 Table Repository 기능 구현하기 (Predicate 직접삽입)

1.기존 SpringDataJpa Repository에 새로 QuerydslPredicateExecutor를 상속받는다. (인터페이스) public interface MemberRepository extends JpaRepository , MemberRepositoryCustom , QuerydslPredicateExecutor { //select m from Member m where m.username = ? List findByUsername(String username); } 기본적인 사용법 @Test public void querydslPredicateExecutorTest() throws Exception { QMember member = QMember.member; Iterable resul..

스프링/QueryDsl 2022.03.22

[QueryDsl] `JPA Repository + QueryDsl`로 동적 쿼리 & API 개발 구축 (Builder or 다중 Where 메서드)

순수 JPA Repository를 구축하여 QueryDsl 을 추가해본다. QueryDsl을 위한 JPAQueryFactory는 2가지 방법으로 주입 가능하다. @Bean으로 등록 후 @Autowired 생성자 주입 @Bean JPAQueryFactory jpaQueryFactory(EntityManager em) { return new JPAQueryFactory(em); } // 1. @Bean으로 등록 후 주입받기 // @Autowired // JPAQueryFactory queryFactory; or // 2. 생성자 주입받기 ( new) //public MemberJpaRepository(EntityManager em) { // this.em = em; // this.queryFactory = ..

스프링/QueryDsl 2022.03.21

[QueryDsl] sqlFunction 사용하기

보통 일반적인 내장 function들은 기본제공된다. 각 DB에 맞춘 Dialect에 선언된 Function들은 기본 제공되지만, 자기가 DB에 만든 Function은 기본 Dialect를 상속받아 만든 파일을 등록하고, yml같은 파일에 선언해줘야한다. H2Dialect에 선언된 기본 기능들 rtrim, space 등등 다양한 기능들을 제공한다. 기본 사용 기능중 replace 예제 @Test public void sqlFunction() throws Exception { //username의 memeber를 다 m으로 치환하는 Function List result = queryFactory .select( Expressions.stringTemplate("function('replace', {0}, ..

스프링/QueryDsl 2022.03.13

[QueryDsl] 벌크 update,delete

전체 데이터를 한번에 수정하는 경우를 벌크 연산이라고 한다. 종종 전체 데이터를 수정해야 하는 일이 생기는데, 어떻게 QueryDsl에서 벌크연산을 하는지 알아보자. 조건부로 특정 값 일괄 Update @Test public void bulkUpdate() throws Exception { //28살 미만은 다 비회원으로 이름을 변경하는 예시 long updateCnt = queryFactory .update(member) .set(member.username, "비회원") .where(member.age.lt(28)) .execute(); em.flush(); em.clear(); /* update Member member1 set member1.username = '비회원'1 where member1..

스프링/QueryDsl 2022.03.13

[QueryDsl] 동적쿼리짜기

QueryDsl의 동적 쿼리를 해결하는 방식 기본적으로 쿼리를 동적으로 사용한다는 의미는 파라미터의 값이 Null이냐 아니냐에 따라 동적으로 쿼리가 작성이 되는게 목적이다. ex) 검색조건에서 많이 사용되는 것들` 1.BooleanBuilder 사용하기 2.where절에 다중 파라미터 사용하기 BooleanBuilder 사용 package com.querydsl.core BooleanBuilder 사용한다. BooleanBuilder는 두개의 생성자를 가지고 있다. 최초 선언에 Predicate를 선언할 수 있는데, 생성하면서 null이면 안되는 Param들을 미리 선언해주면 된다. /** * Create an empty BooleanBuilder */ public BooleanBuilder() { } ..

스프링/QueryDsl 2022.03.11

[QueryDsl] Projection(select에서 뭘 가져올까?)종류에 따른 결과 반환 (Tuple, Dto로 반환)하는 법

프로젝션 select 절에 뭘 가져올지 대상을 지정하는 것 대상이 1개일 때 -> 명확하게 타입 지정하여 반환 대상이 둘 이상일 때 -> Dto나 튜플로 반환 대상이 1개일 때 @Test public void oneProjection() throws Exception { //userName을 String으로 받는 모습 List result = queryFactory .select(member.username) .from(member) .fetch(); } //member 객체 하나만 받는것도 원프로젝션이라 한다. List result2 = queryFactory .select(member) .from(member) .fetch(); 대상이 2개 이상일 때 튜플인 경우 💥Tuple의 경우 package c..

스프링/QueryDsl 2022.03.11

[QueryDsl] Case문, 상수 출력, 특정 문자값 붙여 출력하기

QueryDsl Case문 예제 쿼리를 사용할 때, 경우에 따라 다른 값으로 치환을 Data에서 바로 할 경우가 있다. 주로 화면에 Fit하게 가져올 때 사용할 것 같은데 DB는 그냥 퍼올려서 Stream으로 Dto생성해서 처리하는것보다 좋을지는 역시나 고민해봐야할 문제 기본 CASE문, caseBuilder CASE문 간단한 Case문 그냥 when(경우).then(치환글) 만 사용하면 된다. 말 그대로 간단한 경우 @Test public void basicCase() throws Exception { List result = queryFactory .select(member.age .when(10).then("열살") .when(20).then("스무살") .otherwise("기타")) .from(..

스프링/QueryDsl 2022.03.10
1 2