전체 글 563

서브 쿼리

쿼리안에 쿼리를 넣는작업을 해보자 com.querydsl.jpa.JPAExpressions 사용 나이가 가장 많은 회원을 조회해보면 /** * 나이가 가장 많은 회원 조회 */ @Test public void subQuery() { QMember memberSub = new QMember("memberSub"); List result = queryFactory // member 테이블을 가져오고 .selectFrom(member) // member의 나이가 같은데 .where(member.age.eq( // member의 나이가 가장 큰사람이랑 같다. => 40이라는 값이 나올꺼다 JPAExpressions .select(memberSub.age.max()) .from(memberSub) )) .fetc..

Spring/QueryDSL 2022.04.20

조인 - 페치 조인

페치 조인은 SQL에서 제공하는 기능은 아니고 SQL조인 활용해서 연관된 엔티티 SQL 한번에 조회하는 기능이다. 주로 성능 최적화에 사용하는 방법 Member에 team은 lazy로 세팅 // 연관관계(team과의 연관관계)의 주인은 여기 => JPA 완벽히 숙지 // ManyToOne은 항상 fetch를 lazy로 @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "team_id") private Team team; fetchjoin test를 돌려보면 @Test public void fetchJoinNo() { // 데이터를 깔끔하게 지우자. // fetchjoin 테스트 할 때는 영속성 컨텍스트에 남아있는 거 안지워주면 결과를 제대로 못본다. // 영..

Spring/QueryDSL 2022.04.20

조인 - 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