QueryDSL

노건우·2023년 10월 20일
0

Spring

목록 보기
22/22
post-thumbnail

✍️기본 Q- type 활용

  • Q클래스 인스턴스를 사용하는 2가지 방법
  • QMember qMember = new QMember("m"); //별칭을 직접 지정
  • QMember qMember = QMember.member; //기본 인스턴스 사용

💻JPQL이 제공하는 검색 조건 제공

  • member.username.eq("member1") //username = 'member1'
  • member.username.ne("member1") // username != 'member1'
  • member.username.eq("member1").not() //username != 'member1'

-memebr.username.isNotNull() //이름이 is not null

-member.age.in(10,20) //age in (10,20)

  • member.age.notIn(10,20) //age not in(10,20)
  • member.age.between(10,30) //between 10, 30

-member.age.goe(30) //age >= 30
-member.age.gt(30) //age > 30
-member.age.loe(30) //age <= 30
-member.age.lt(30) //age < 30

  • member.username.like("member%") //like검색
  • member.username.contains("member") //like '%member%' 검색
  • member.username.startsWith("member") //like 'member%' 검색

🖥️결과 조회

-fetch() :리스트 조회
-fetchOne() :단건 조회
->결과가 없으면 :null
-> 결과가 둘 이상이면
-fetchFirst() : limit(1).fetchOne()

  • fetchResults() : 페이징 정보를 포함, total count 추가 쿼리 실행
  • fetchCount() : count쿼리로 변경해서 count 수 조회

정렬

  • desc(), asc() : 일반정렬
  • nullsLast(),nullsFirst() : null 데이터 순서 부여

집합

-count(m) :회원수
-sum(m.age) :나이 합
-avg(m.age) : 평균 나이
-max(m.age) : 최대나이
-min(m.age) : 최소 나이

조인 - on절

서브쿼리

-from절에 서브 쿼리 한계가 존재한다.

Case문

프로젝션과 결과 반환

  • List
    -List

  • list : 대상이 둘 이상일 때

  • 결과값 반환 : DTO

    결과값 반환QueryDSL

  • 프로퍼티 접근

  • 필드 직접 접근

  • 생성자 사용

예시코드

package com.codingbox.querydsl.main;

import java.util.List;

import static com.codingbox.querydsl.entity.QMember.*;
import static com.codingbox.querydsl.entity.QTeam.*;


import com.codingbox.querydsl.entity.Member;
import com.codingbox.querydsl.entity.MemberDTO;
import com.codingbox.querydsl.entity.QMember;
import com.codingbox.querydsl.entity.Team;
import com.querydsl.core.Tuple;
import com.querydsl.core.types.Expression;
import com.querydsl.core.types.Projections;
import com.querydsl.core.types.dsl.CaseBuilder;
import com.querydsl.core.types.dsl.Expressions;
import com.querydsl.jpa.JPAExpressions;
import com.querydsl.jpa.impl.JPAQueryFactory;

import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.EntityTransaction;
import jakarta.persistence.Persistence;

public class Main10 {

	public static void main(String[] args) {
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
		EntityManager em = emf.createEntityManager();
		JPAQueryFactory queryFactory = new JPAQueryFactory(em);
		EntityTransaction tx = em.getTransaction();
		tx.begin();
		
		try {
			Team teamA = new Team("teamA");
			Team teamB = new Team("teamB");
			em.persist(teamA);
			em.persist(teamB);
			
			Member member1 = new Member("member1", 10, teamA);
			Member member2 = new Member("member2", 20, teamA);
			Member member3 = new Member("member3", 30, teamB);
			Member member4 = new Member("member4", 40, teamB);
			Member member5 = new Member(null, 100, teamB);
			Member member6 = new Member("member6", 100, teamB);
			Member member7 = new Member("member7", 100, teamB);
			em.persist(member1);
			em.persist(member2);
			em.persist(member3);
			em.persist(member4);
			em.persist(member5);
			em.persist(member6);
			em.persist(member7);
			//초기화
			em.flush();
			em.clear();
			
			//JPQL  사용
			List<MemberDTO> result = em.createQuery(
					"select new com.codingbox.querydsl.entity.MemberDTO(m.username,m.age)"
					+ "from Member m",MemberDTO.class
					).getResultList();
			for(MemberDTO memberDTO : result) {
				System.out.println("memberDTO: " +memberDTO);
			}
			
			//QueryDSL - 프로퍼티 접근
			/*
			 * beqn -> getter, setter
			 * 1param : MemberDTO.class -> type 지정
			 * 2param~ : 꺼내올 값 나열
			 */
			List<MemberDTO> result2 = queryFactory		
									  .select(Projections.bean(MemberDTO.class, member.username,member.age))
									  .from(member)
									  .fetch();
			for(MemberDTO memberDTO : result2) {
				System.out.println("MemberDTO2 : " + memberDTO);
			}
			//필드 직접 접근
			// getter, setter가 없어ㅓ도 된다.
			List<MemberDTO> result3 = queryFactory		
					  .select(Projections.fields(MemberDTO.class, member.username,member.age))
					  .from(member)
					  .fetch();
					for(MemberDTO memberDTO : result3) {
					System.out.println("MemberDTO3 : " + memberDTO);
					}
			//생성자
			List<MemberDTO> result4 = queryFactory		
						 .select(Projections.constructor(MemberDTO.class, member.username,member.age))
					  .from(member)
					  .fetch();
						for(MemberDTO memberDTO : result4) {
						System.out.println("MemberDTO4 : " + memberDTO);
							}
			
			
			
			tx.commit();
			
		}catch (Exception e) {
			tx.rollback();
		}finally {
			em.close();
			emf.close();
		}
		
		

	}

}
profile
초보 개발자 이야기

0개의 댓글

관련 채용 정보