➡️JAVA로 쿼리를 작성하여 컴파일 시점에 문법 오류를 잡을 수 있고 파라미터 바인딩이 자동으로 된다는 장점과 복잡한 쿼리 작성 및 동적 쿼리를 해결할 수 있다.
fetch() : 1건 이상 조회(List 조회)하며 데이터가 없으면 빈 리스트를 반환
fetchOne() : 단 건 조회를 하며 결과가 없으면 null을 둘 이상이면 NonUniqueResultException
발생
fetchFirst() : limit(1).fetchOne()과 동일 값 반환
fetchResults() : 페이징 정보를 포함하며 total count 쿼리 추가 실행
fetchCount() : count 쿼리로 변경하여 count 수 조회
📌AND 연산
Member findMember = queryFactory
.selectFrom(member)
.where(member.username.eq("member1").and(member.age.eq(10)))
.fetchOne();
Member findMember = queryFactory
.selectFrom(member)
.where(member.username.eq("member1"),(member.age.eq(10)))
.fetchOne();
AND 연산은 ,
로 대체 가능하다.
📌동등 조건
// username = 'member1'
member.username.eq("member1")
//username != 'member1'
member.username.ne("member1")
// username != 'member1
member.username.eq("member1").not()
📌NOT NULL
// username != NULL
member.username.isNotNull()
📌IN, BETWEEN
// age in (10,20)
member.age.in(10, 20)
// age not in (10, 20)
member.age.notIn(10, 20)
//between (10, 30)
member.age.between(10,30)
📌부등호 연산
// age >= 30
member.age.goe(30)
// age > 30
member.age.gt(30)
// age <= 30
member.age.loe(30)
// age < 30
member.age.lt(30)
📌LIKE
//like 검색
member.username.like("member%")
// like ‘%member%’ 검색
member.username.contains("member")
//like ‘member%’ 검색
member.username.startsWith("member")
기본적인 연산은 SQL 쿼리 작성과 동일하게 사용되기 때문에 쉽게 이해할 수 있다.
/* 회원 나이 내림차순, 회원 이름 올림차순 정렬 + 회원 이름이 null이면 마지막 출력*/
List<Member> result = queryFactory
.selectFrom(member)
.where(member.age.eq(100))
.orderBy(member.age.desc(), member.username.asc().nullsLast())
.fetch();
List<Member> result = queryFactory
.selectFrom(member)
.orderBy(member.username.desc())
.offset(1)
.limit(2)
.fetch();
offset은 시작지점을 나타내며 0부터 시작한다.
limit는 page size를 나타낸다.
QueryResults<Member> queryResults = queryFactory
.selectFrom(member)
.orderBy(member.username.desc())
.offset(1)
.limit(2)
.fetchResults();
위의 쿼리와 다른 점은 fetchResults()
를 사용했다는 점으로 count를 계산하는 쿼리가 추가로 실행되기 때문에 총 2번의 쿼리가 실행된다.
따라서 QueryResults
를 통해 결과 값을 받으며 getTotal()
로 count 값을 얻고, getResults()
로 결과 값을 얻을 수 있다.
List<Tuple> result = queryFactory
.select(member.count(),
member.age.sum(),
member.age.avg(),
member.age.max(),
member.age.min())
.from(member)
.fetch();
SQL문법과 동일하게 합계, 평균, 최대, 최소 함수를 이용할 수 있으며 받은 인자의 타입이 모두 다르기 때문에 Querydsl에서 제공하는 Tuple
을 통해 값을 받는다.
/*팀의 이름과 각 팀의 평균 연령*/
List<Tuple> result = queryFactory
.select(team.name, member.age.avg())
.from(member)
.join(member.team, team)
.groupBy(team.name)
.fetch();
Querydsl의 기본 문법은 SQL 문법과 동일하게 작성할 수 있기 때문에 금방 배울 수 있다.
여기에 JOIN
문법을 추가로 학습해야 하는데 JOIN
또한 SQL 문법과 동일하지만 조금 더 차근히 학습해보고자 따로 포스팅할 예정이다.
학습 강의 : 실전! Querydsl