QueryDSL (9) 썸네일형 리스트형 [QueryDSL] 스프링 데이터 페이징와 Querydsl 페이징 연동 스프링 데이터 페이징 활용1 - Querydsl 페이징 연동스프링 데이터의 Page, Pageable을 활용해보자.전체 카운트를 한번에 조회하는 단순한 방법데이터 내용과 전체 카운트를 별도로 조회하는 방법사용자 정의 인터페이스에 페이징 2가지 추가public interface MemberRepositoryCustom { List search(MemberSearchCondition condition); Page searchPageSimple(MemberSearchCondition condition, Pageable pageable); Page searchPageComplex(MemberSearchCondition condition, Pageable pageable);} 1. 전체 카운트를 .. [QueryDSL] 스프링 Data JPA와 QueryDSL 스프링 데이터 JPA - MemberRepository 생성 public interface MemberRepository extends JpaRepository { List findByUsername(String username);}Querydsl 전용 기능인 회원 search를 작성할 수 없다. → 사용자 정의 리포지토리 필요사용자 정의 리포지토리 사용법사용자 정의 인터페이스 작성사용자 정의 인터페이스 구현스프링 데이터 리포지토리에 사용자 정의 인터페이스 상속사용자 정의 리포지토리 구성 1. 사용자 정의 인터페이스 작성public interface MemberRepositoryCustom extends MemberRepository{ List search(MemberSearchConditio.. [QueryDSL] 순수 JPA와 QueryDSL 순수 JPA 리포지토리와 QueryDSL순수 JPA 리포지토리@Repositorypublic class MemberJpaRepository { private final EntityManager em; private final JPAQueryFactory queryFactory; public MemberJpaRepository(EntityManager em) { this.em = em; this.queryFactory = new JPAQueryFactory(em); } public void save(Member member) { em.persist(member); } public Optional findById(Long id) { .. [QueryDSL] 수정, 삭제 벌크 연산, SQL function 호출 수정, 삭제 벌크 연산 1. 쿼리 한번으로 대량 데이터 수정@Testpublic void bulkUpdate() { long count = queryFactory .update(member) .set(member.username, "비회원") .where(member.age.lt(28)) .execute(); Assertions.assertThat(count).isEqualTo(2);} 2. 기존 숫자에 1 더하기, 곱하기@Testpublic void bulkAdd() { long count = queryFactory .update(member) .set(member.ag.. [QueryDSL] 동적 쿼리 동적 쿼리동적 쿼리를 해결하는 두가지 방식BooleanBuilderWhere 다중 파라미터 사용1. BooleanBuilder 사용@Testpublic void dynamicQuery_BooleanBuilder() { 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 Boo.. [QueryDSL] 프로젝션과 결과 반환 1️⃣ 프로젝션과 결과 반환 - 기본프로젝션: select 대상 지정 1. 프로젝션 대상이 하나 List result = queryFactory .select(member.username) .from(member) .fetch();프로젝션 대상이 하나면 타입을 명확하게 지정할 수 있음.프로젝션 대상이 둘 이상이면 튜플이나 DTO로 조회 2. 튜플 조회 - 프로젝션 대상이 둘 이상일 때 사용@Testpublic void tupleProjection() { // `com.querydsl.core.Tuple` List result = queryFactory .select(member.username, member.age) .from(m.. [QueryDSL] 기본 문법 기본 Q-Type 활용1️⃣ Q클래스 인스턴스를 사용하는 2가지 방법QMember qMember = new QMember("m"); // 1. 별칭 직접 지정 QMember qMember = QMember.member; // 2. 기본 인스턴스 사용같은 테이블을 조인해야 하는 경우가 아니면 기본 인스턴스를 사용하자✏️ 기본 인스턴스를 static import와 함께 사용import static study.querydsl.entity.QMember.*;@SpringBootTest@Transactionalpublic class QuerydslBasicTest { @Autowired EntityManager em; JPAQueryFactory queryFactory; @BeforeEach.. [QueryDSL] Querydsl 설정과 검증 1️⃣ Gradle 설정 - 스프링 부트 3.x dependencies { //QueryDsl implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api"} 2️⃣ Querydsl 환경설정 검증 1. 검증용 엔티티 생성@Entity@Getter@Setterpublic class Hello { @Id @GeneratedVa.. [Querydsl] QueryDSL 란? QueryDSL은 타입 안전(Type-Safe)한 동적 쿼리를 생성할 수 있도록 지원하는 Java 기반 ORM(Object-Relational Mapping) 프레임워크이다. JPA(Java Persistence API)를 사용할 때 JPQL(Java Persistence Query Language) 또는 Criteria API를 대체할 수 있도록 설계되었다. ✏️ 타입 안전한 동적 쿼리란?BooleanBuilder builder = new BooleanBuilder();if (age != null) { builder.and(m.age.gt(age)); // 나이가 age보다 큰 조건 추가}if (name != null) { builder.and(m.name.eq(name)); // 이름이 같.. 이전 1 다음