vue + jpa project (30) - Querydsl 문법 세부 확인 본문

프로그램/Vue.js

vue + jpa project (30) - Querydsl 문법 세부 확인

반응형

이번 장에서는 Querydsl 에 대한 문법을 하나하나씩 정리해보겠다. 

 

시작하기 앞서 Querydsl 의 시작 기준은 아래와 같이 정리한다.

 

EntityManager를 통해서 JPAQuery를 생성하고 Q클래스를 통해서 테이블의 Alias를 부여하는 부분을 기준으로 삼겠다.

EntityManager em = emf.createEntityManager();
    
JPAQuery query = new JPAQuery(em); 
QMember qmember = new QMember("m");
List<Member> members = query.from(qMember)
                            .where(qMember.name.eq("회원1"))
                            .orderBy(qMember.name.desc())
                            .list(qMember);

 

 

1. 쿼리 타입 메소드 사용법

item.name.eq("상품1")  //name = '상품1'   
item.name.ne("상품1")  //name != '상품1'  
item.name.eq("상품1").not()  // name != '상품1'
item.name.isNotNull()  //상품명이 null이 아닌 것   
item.price.in(10000, 20000)  //가격이 10000원 또는 20000원
item.price.notIn(10000, 20000)  //가격이 10000원 또는 20000원이 아닌 것 
item.price.between(10000, 20000)  //가격이 10000원 ~ 20000원
item.price.goe(10000)  //price >= 10000
item.price.gt(10000)  //price > 10000   
item.price.loe(20000)  //price <= 20000 
item.price.lt(20000)  //price < 20000
item.name.like("고급%")  //like 검색, 이름이 '고급'으로 시작하는 상품 
item.name.contains("상품1")  //like ‘%상품1%’ 검색, '상품1'이라는 이름을 포함한 상품
item.name.startsWith("고급")  //like ‘고급%’ 검색, 이름이 '고급'으로 시작하는 상품

 

 

2. 페이징과 정렬

[정렬]

orderBy 사용
쿼리 타입(Q)이 제공하는 asc(), desc() 사용
asc() : 오름차순
desc() : 내림차순
nullsLast(), nullFirst() : null 데이터 순서 부여

 

[페이징]

offset과 limit을 적절히 조합하여 사용
offset : 결과의 시작 행
limit : 최대 결과 개수

restrict() 메소드에 파라미터로 com.mysema.query.QueryModifiers 사용 가능
restrict() : limit과 offset 함께 정의

 

 

3. 그룹핑

groupBy : 그룹화
having : 그룹화된 결과 제한

 

 

4. 집합 함수

    select절에서 사용한다.

   예시는 select(member.count(), member.age.sum(), member.age.avg(), member.age.max(), member.age.min())

count() : 카운트
sum()   : 합
avg()   : 평균
max()   : 최대
min()   : 최소

 

 

5. 조인

innerJoin(join)
leftJoin
rightJoin
fullJoin

 

 

6. 결과조회

fetch() : 리스트 조회, 데이터 없으면 빈 리스트 반환
fetchOne() : 단 건 조회
             결과가 없으면 : null
             결과가 둘 이상이면:com.querydsl.core.NonUniqueResultException
fetchFirst() : limit(1).fetchOne()
fetchResults() : 페이징 정보 포함, total count 쿼리 추가 실행
fetchCount() : count 쿼리로 변경해서 count 수

 

 

7. 프로젝션 처리

 - select 절에 조회 대상을 지정하는 것으로써 3가지 방법이 있다.

  • 프로퍼티 접근 (Setter)
    Projections.bean() → 수정자(Setter)를 사용 해서 값을 채운다.
    쿼리 결과와 매핑할 프로퍼티 이름이 다를 경우에는 → as를 사용하여 별칭 지정한다.
 queryFactory
        .select(Projections.bean(MemberDto.class,
                member.username,
                member.age))
        .from(member)
        .fetch();
  • 생성자 접근
    Projections.constructor() → 생성자를 호출해서 대입한다. 단, 해당 생성자가 반드시 존재해야한다.
 queryFactory
        .select(Projections.constructor(MemberDto.class,
                member.username,
                member.age))
        .from(member)
        .fetch();
  • 필드 직접 접근
    Projections.fields() 사용한다. 필드를 private으로 설정해도 동작한다.
 queryFactory
        .select(Projections.fields(MemberDto.class,
                member.username,
                member.age))
        .from(member)
        .fetch();
  • 별칭이 다를때
프로퍼티나 필드 접근 생성 방식에서 필드 이름이 다를 때 해결방안
ExpressionUtils.as(query, alias) : 필드나 서브쿼리에 별칭 적용

 

 

8. 서브쿼리

 - JPAExpressions를 사용하여 subquery를 구현한다.

List<Member> result = queryFactory
        .selectFrom(member)
        .where(member.age.eq(
            JPAExpressions
                .select(memberSub.age.max())
                .from(memberSub)
        ))
        .fetch()

 

  

9. Case 문

 - .when ~ 절 n개와 otherwise 1개의 구문으로 처리가 가능하다.

List<String> result = queryFactory
        .select(member.age
                .when(10).then("열살")
                .when(20).then("스물살")
                .otherwise("기타"))
        .from(member)
        .fetch();


List<String> result = queryFactory
        .select(new CaseBuilder()
                .when(member.age.between(0, 10)).then("10살이하")
                .when(member.age.between(11, 20)).then("20살이하")
                .otherwise("기타"))
        .from(member)
        .fetch();

 

- orderBy에서 Case 문 함께 사용

    NumberExpression<Integer> rankPath = new CaseBuilder()
            .when(member.age.between(0, 10)).then(1)
            .when(member.age.between(11, 20)).then(2)
            .otherwise(3);

    List<Tuple> result = queryFactory
            .select(member.username, member.age, rankPath)
            .from(member)
            .orderBy(rankPath.desc())
            .fetch();

 

 

 10. 문자 더하기 - concat

String result = queryFactory
        .select(member.userid.concat("_").concat(member.age.stringValue()))
        .from(member)
        .where(member.username.eq("member3"))
        .fetchOne();

 

1차적으로 이정도로 정리하고 

추가로 나올때마다 계속 업데이트 해야할 듯 하다.

 

vue.js와 JPA를 연동하는 부분에 대해서 총 30개의 글로 진행해 봤다. 

일단 시즌1 개념으로 이 정도로 마무리하고 다음에 좀 더 상세하게 처리할 수 있는 부분이 있다면

시즌 2개념으로 다시 시작 해보도록 하겠다. 

 

반응형

프로그램/Vue.js Related Articles

MORE

Comments