Spring/QueryDSL 21

조인 - on 절

ON절을 활용해 조인(JPA 2.1 부터 지원) 조인 대상 필터링 연관관계 없는 엔티티 외부 조인 => 이게 많이 쓰인다. 조인 on절 test를 돌려보면 /** * 예) 회원과 팀을 조인하면서, 팀 이름이 teamA인 팀만 조인, 회원은 모두 조회 * // 회원이랑 팀을 조회하면서 조인을 하는데 팀의 이름이 teamA인 애만 가지고 온다. * JPQL: select m, t from Member m left join m.team t on t.name = 'teamA' */ @Test public void join_on_filtering() { // Tuple가 나온 이유는 select절이 여러개이기 때문이다. List result = queryFactory .select(member, team) .fr..

Spring/QueryDSL 2022.04.20

조인 - 기본 조인

기본 조인 문법 첫 번째 파라미터에 조인 대상을 지정하고, 두 번째 파라미터에 별칭(alias)으로 사용할 Q 타입을 지정하면 된다. join test를 돌려보면 /** * 팀 A에 소속된 모든 회원 */ @Test public void join() { List result = queryFactory .selectFrom(member) // member와 team을 join하고 .join(member.team, team) // teamA에 소속된 애를 찾고 .where(team.name.eq("teamA")) .fetch(); assertThat(result) .extracting("username") .containsExactly("member1", "member2"); } 실행창에 inner join..

Spring/QueryDSL 2022.04.20

집합

집합 groupby having에 대해서 알아보자. test를 실행해보자. tuple 쓴 이유는 타입이 count age.sum 등등 여러개가 들어오기 때문에 tuple을 썼다. @Test public void aggregation() { // tuple로 조회하게 되는데 (여러개 타입 있을 때 꺼내 올수 있는거) 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(member.count())).isEqu..

Spring/QueryDSL 2022.04.20

결과 조회

결과 조회 리스트는 아래와 같다. fetch(): 리스트 조회, 데이터 없으면 빈 리스트 반환 fetchOne(): 단 건 조회 결과가 없으면: null 결과가 둘 이상이면: com.querydsl.core.NonUniqueResultException fetchFirst(): limit(1).fetchOne() fetchResult(): 페이징 정보 포함, total count 쿼리 추가 실행 fetchCount(): count 쿼리로 변경해서 count 수 조회 @Test public void resultFetch() { // member의 목록을 list로 조회 // List fetch = queryFactory // .selectFrom(member) // .fetch(); // Member fet..

Spring/QueryDSL 2022.04.20

검색 조건 쿼리

실행해보면 @Test public void search() { Member findMember = queryFactory .selectFrom(member) // 이름이 member1이면서 나이가 10살인 사람을 조회 .where(member.username.eq("member1") .and(member.age.eq(10))) .fetchOne(); assertThat(findMember.getUsername()).isEqualTo("member1"); } 실제 쿼리가 and로 되어있다. /* select member1 from Member member1 where // JPQL도 1 2 로 걸려있다. member1.username = ?1 and member1.age = ?2 */ select memb..

Spring/QueryDSL 2022.04.19

기본 Q-Type 활용

Q 클래스를 사용하는 방법에는 두 가지 방법이 있다. Q Member로 가보면 아래와 같이 new QMember이 나와있는데 쓰면 된다. @Generated("com.querydsl.codegen.DefaultEntitySerializer") public class QMember extends EntityPathBase { private static final long serialVersionUID = -769675599L; private static final PathInits INITS = PathInits.DIRECT2; public static final QMember member = new QMember("member1"); @Test public void startQuerydsl() { // ..

Spring/QueryDSL 2022.04.19

예제 도메인 모델 동작확인

예제 도메인 모델을 참고하여 엔티티 코드를 작성해보자. // Member Class package study.querydsl.entity; import lombok.*; import javax.persistence.*; @Entity // Setter는 실무에서 가급적 쓰지말자 @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) //ToString은 아래를 자동으로 만들어준다. //@Override //public String toString() { // return "Member{" + // "id=" + id + // ", username='" + username + '\'' + // ", age=" + age + // ", team..

Spring/QueryDSL 2022.04.19

스프링 부트 설정 - JPA, DB

application.properties는 삭제하고 application.yml파일을 만들자. application.yml 파일 spring: datasource: url: jdbc:h2:tcp://localhost/~/querydsl username: sa password: driver-class-name: org.h2.Driver jpa: hibernate: # 애플리케이션 로딩 시점에 테이블을 다 drop하고 다시 생성 # 만약 create-drop을 하면 다시 다 날리고 테이블 만든다음 애플리케이션 내릴때 테이블도 다 날린다. # 끝나고 테이블 볼수 있는게 없어서 그냥 create로 설정 ddl-auto: create properties: hibernate: # query 이쁘게 보기 # show..

Spring/QueryDSL 2022.04.19