조인 - 페치 조인
2022. 7. 25. 11:12
Querydsl
페치 조인은 SQL에서 제공하는 기능은 아니다. SQL조인을 활용해서 연관된 엔티티를 SQL 한번에 조회하는 기능이다. 주로 성능 최적화에 사용하는 방법이다. 페치 조인 미적용 지연로딩으로 Member, Team SQL 쿼리 각각 실행 @PersistenceUnit EntityManagerFactory emf; @Test public void fetchJoinNo() { em.flush(); em.clear(); Member findMember = queryFactory .selectFrom(member) .where(member.username.eq("member1")) .fetchOne(); boolean loaded = emf.getPersistenceUnitUtil().isLoaded(findMe..
조인 - on절
2022. 7. 25. 10:09
Querydsl
ON절을 활용한 조인(JPA 2.1부터 지원) 1. 조인 대상 필터링 2. 연관관계 없는 엔티티 외부 조인 1. 조인 대상 필터링 예) 회원과 팀을 조인하면서, 팀 이름이 teamA인 팀만 조인, 회원은 모두 조회 /** * 예) 회원과 팀을 조인하면서, 팀 이름이 teamA인 팀만 조인, 회원은 모두 조회 * JPQL: SELECT m, t FROM Member m LEFT JOIN m.team t on t.name = 'teamA' * SQL: SELECT m.*, t.* FROM Member m LEFT JOIN Team t ON m.TEAM_ID=t.id and t.name='teamA' */ @Test public void join_on_filtering() throws Exception { L..
조인 - 기본 조인
2022. 7. 24. 21:21
Querydsl
기본 조인 조인의 기본 문법은 첫 번째 파라미터에 조인 대상을 지정하고, 두 번째 파라미터에 별칭(alias)으로 사용할 Q 타입을 지정하면 된다. join(조인 대상, 별칭으로 사용할 Q타입) @Test public void join() { List result = queryFactory .selectFrom(member) .join(member.team, team) .where(team.name.eq("teamA")) .fetch(); assertThat(result).extracting("username").containsExactly("member1", "member2"); } join() , innerJoin() : 내부 조인(inner join) leftJoin() : left 외부 조인(le..
집합
2022. 7. 24. 20:49
Querydsl
집합 함수 /** * JPQL * select * COUNT(m), //회원수 * SUM(m.age), //나이 합 * AVG(m.age), //평균 나이 * MAX(m.age), //최대 나이 * MIN(m.age) //최소 나이 * from Member m */ @Test public void aggregation() throws Exception { List result = queryFactory .select(member.count(), member.age.sum(), member.age.avg(), member.age.max(), member.age.min()) .from(member) .fetch(); Tuple tuple = result.get(0); assertThat(tuple.get(m..
페이징
2022. 7. 24. 20:28
Querydsl
조회 건수 제한 @Test public void paging1() { List result = queryFactory .selectFrom(member) .orderBy(member.username.desc()) .offset(1) //0부터 시작(zero index) .limit(2) //최대 2건 조회 .fetch(); assertThat(result.size()).isEqualTo(2); } 전체 조회 수가 필요하면? @Test public void paging2() { QueryResults queryResults = queryFactory .selectFrom(member) .orderBy(member.username.desc()) .offset(1) .limit(2) .fetchResults(..
정렬
2022. 7. 24. 19:42
Querydsl
/** * 회원 정렬 순서 * 1. 회원 나이 내림차순(desc) * 2. 회원 이름 올림차순(asc) * 단 2에서 회원 이름이 없으면 마지막에 출력(nulls last) */ @Test public void sort() { em.persist(new Member(null, 100)); em.persist(new Member("member5", 100)); em.persist(new Member("member6", 100)); List result = queryFactory .selectFrom(member) .where(member.age.eq(100)) .orderBy(member.age.desc(), member.username.asc().nullsLast()) .fetch(); Member me..
결과 조회
2022. 7. 24. 17:06
Querydsl
fetch() : 리스트 조회, 데이터 없으면 빈 리스트 반환 fetchOne() : 단 건 조회 결과가 없으면 : null 결과가 둘 이상이면 : com.querydsl.core.NonUniqueResultException fetchFirst() : limit(1).fetchOne() fetchResults() : 페이징 정보 포함, total count 쿼리 추가 실행 fetchCount() : count 쿼리로 변경해서 count 수 조회 //List List fetch = queryFactory .selectFrom(member) .fetch(); //단 건 Member findMember1 = queryFactory .selectFrom(member) .fetchOne(); //처음 한 건 조회..
검색 조건 쿼리
2022. 7. 24. 15:46
Querydsl
기본 검색 쿼리 @Test public void search() { Member findMember = queryFactory .selectFrom(member) .where(member.username.eq("member1").and(member.age.eq(10))) .fetchOne(); assertThat(findMember.getUsername()).isEqualTo("member1"); } 검색 조건은 .and() , . or() 를 메서드 체인으로 연결할 수 있다. 참고: select , from 을 selectFrom 으로 합칠 수 있음 JPQL이 제공하는 모든 검색 조건 제공 member.username.eq("member1") // username = 'member1' member.us..
기본 Q-Type 활용
2022. 7. 24. 15:33
Querydsl
Q클래스 인스턴스를 사용하는 2가지 방법 QMember qMember = new QMember("m"); //별칭 직접 지정 QMember qMember = QMember.member; //기본 인스턴스 사용 기본 인스턴스를 static import와 함께 사용 import static study.querydsl.entity.QMember.*; @Testpublic void startQuerydsl3() { //member1을 찾아라. Member findMember = queryFactory .select(member) .from(member) .where(member.username.eq("member1")) .fetchOne(); assertThat(findMember.getUsername()).i..
JPQL vs Querydsl
2022. 7. 24. 15:02
Querydsl
@Test public void startJPQL() { //member1을 찾아라. String qlString = "select m from Member m " + "where m.username = :username"; Member findMember = em.createQuery(qlString, Member.class) .setParameter("username", "member1") .getSingleResult(); assertThat(findMember.getUsername()).isEqualTo("member1"); } @Test public void startQuerydsl() { //member1을 찾아라. JPAQueryFactory queryFactory = new JPAQuery..
Querydsl 설정과 검증
2022. 7. 23. 23:14
Querydsl
build.gradle 에 주석을 참고해서 querydsl 설정 추가 plugins { id 'org.springframework.boot' version ‘2.2.2.RELEASE' id 'io.spring.dependency-management' version '1.0.8.RELEASE' //querydsl 추가 id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" id 'java' }group = 'study' version = '0.0.1-SNAPSHOT' sourceCompatibility = '1.8' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { ..