스프링데이터 + JPA/QueryDSL 38

17. 서브 쿼리

그 왜 SQL에서 막 쓰다가 () 괄호 하고 새 쿼리 쓰는 그걸 서브 쿼리라고 함. 일단 서브쿼리를 사용할 때는 JPAExpressions, 직역은 JPA 표현식을 이용 // 나이가 가장 많은 회원 조회 @Test public void subQuery(){ QMember memberSub = new QMember("memberSub"); Member member = query.selectFrom(m).orderBy(m.age.desc()).limit(1).fetchOne(); System.out.println("member = " + member.getAge()); List result = query.selectFrom(m). where( m.age.eq( JPAExpressions. select(mem..

16. join fetch

join fetch는 SQL에서 제공하는 기능은 아니다. SQL의 조인을 활용하여 여러 엔티티를 한번에 가져오는 쿼리를 만들어 주는 기능이다. https://qwefdg3.tistory.com/782 여기 참고 먼저 join fetch 안했을 때 @Autowired EntityManagerFactory emf; @Test public void fetchJoinNo(){ em.flush(); em.clear(); Member member = query.selectFrom(m).where(m.username.eq("member1")).fetchOne(); boolean loaded = emf.getPersistenceUnitUtil().isLoaded(member.getTeam()); assertThat(l..

15. join on

QueryDSL에서 on절은 조인 대상 필터링 연관관계가 없는 테이블 외부 조인 이 두가지 역할이 가능하다. 이번엔 주로 left join에 대해서 말 할것이다. 먼저, left join이란 from절에 있는 것에 join해서 가져온 것 중 각각 on절에 해당하는 것을 묶어서 나열하는 것이다. from이 중심이다. from의 대상이 되는 것은 다 나열된다. 근데 join해서 가져온 것 중에 from절의 테이블과 연이 없는 것은 그냥 그 열들은 null 상태로 둔다. 그래서, 다대일 관계는 from절과 join절의 테이블 위치를 바꿀 시 결과가 다를 수 있다. from 중심으로, from은 다 나열하고, join해서 가져온 것 중 on의 조건에 맞으면 그 row끼리 붙인다. (근데 이 때 아무래도 일대다 ..

14. join

QMember m = QMember.member; QTeam team = QTeam.team; join(m.team, team) join(조인할대상, 별칭으로사용할Q타입) @Test public void join(){ List result = query.selectFrom(m).join(m.team, t).where(t.name.eq("teamA")).fetch(); assertThat(result).extracting("username").containsExactly("member1", "member2"); } m이 가지고 있는 team을 join해서 가지고 오고, 위에 QTeam = QTeam.team이라고 해놨다. 그 Q클래스를 별칭용 클래스로 쓸 것이다. extracting은 적출 이란 뜻인데, ..

13. 그룹

group by, having 이런 거. 지금 시간들은 일단 1차적으로, QueryDSL의 사용방법, 즉 문법을 알아보는 시간임. @Test public void aggregation(){ List result = query.select(m.count(), m.age.sum(), m.age.avg(), m.age.max(), m.age.min()) .from(m) .fetch(); Tuple tuple = result.get(0); assertThat(tuple.get(m.count())).isEqualTo(4); assertThat(tuple.get(m.age.sum())).isEqualTo(100); assertThat(tuple.get(m.age.avg())).isEqualTo(25); assert..

12. 페이징

페이징이다. 여기선 간단하게 몇번째부터 몇개까지 라고 이해하면 된다. Spring Data JPA에서 객체로 했던 페이징은 뭐랄까 좀더 인간친화적인? 몇페이지의 몇개, 이거고, 이 QueryDSL은 자바의 쿼리 메소드를 통해 JPQL 즉, 쿼리를 만드는 것이므로, offet(몇번째부터), limit(개수)를 활용한다. @Test public void paging1(){ List result = query.selectFrom(m).orderBy(m.username.desc()) .offset(1) .limit(2) .fetch(); for (Member member : result) { System.out.println("member = " + member.getUsername()); } } /* sele..

10. 결과 조회

지금까지 fetchOne()해서 단건 조회만 함 fetch() // 리스트 조회, 데이터 없으면 빈 리스트 반환 fetchOne() // 단건 조회, 데이터 없으면 null, 결과가 둘 이상이면 Exception fetchFirst() // limit(1).fetchOne(), 즉 처음 페이지의 맨처음 데이터 단건만 조회 fetchResults() // 페이징 정보 포함, total count 쿼리 추가 실행. 즉 페이징하고 페이징 데이터 포함 객체 가져오기 용 fetchCount() // count 쿼리 날려서 count만 조회. 일단은 fetch(), fechOne(), fetchFirst() List fetch = query.selectFrom(m).fetch(); Member fetchOne = ..

9. 검색 조건 쿼리

예시로 하나 @Test public void search(){ Member result = query.selectFrom(m) .where(m.username.eq("member1").and(m.age.eq(10))) .fetchOne(); assertThat(result.getUsername()).isEqualTo("member1"); } 지금은 조건문은 eq, 조건 연결문?은 and만 썼는데, 엄청 많음 m.username.eq("member1") // username = 'member1' m.usernmae.ne("member1") // username != 'member1' 즉 not equal m.username.eq("member1").not() // username != 'member1' 기..

8. Q타입

@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"); .... 먼저 Q타입 사용법은 QMember m = QMember.member; QMember m = new QMember("m") //별칭은 무조건 줘야 함. 대충 저렇게 2가지 방법이 있는데, 당연히 위에..