1) 직접 선언(서브쿼리나 같은 테이블 조인 등 별칭이 달라야할 경우 사용)
// 별칭 직접 지정
QMember qMember = new QMember("m");
// 기본 별칭 사용
QMember qMember = QMember.member;
2) 기본 인스턴스로 등록(기본 별칭 사용)
import static study.querydsl.entity.QMember.*;
public Member findMember1() {
Member findMember = queryFactory
.select(member)
.from(member)
.where(member.username.eq("member1"))
.fetchOne();
return findMember;
}
.and() 나 .or() 로 연결 가능
queryFactory
.select(member)
.from(member)
.where(member.username.eq("member1")
.and(member.age.between(10, 30))
.fetch();
, 으로 나열하면 .and()와 동일 (*null값은 무시)
queryFactory
.select(member)
.from(member)
.where(member.username.eq("member1"),
member.age.between(10, 30))
.fetch();
select와 from을 합쳐 selectFrom으로 사용 가능
queryFactory
.selectFrom(member)
.where(member.username.eq("member1"))
.fetch();
JPQL이 제공하는 모든 검색 조건 제공
member.username.eq("member1") // username = 'member1'
member.username.ne("member1") //username != 'member1'
member.username.eq("member1").not() // username != 'member1'
member.username.isNull() // is null
member.username.isNotNull() // is not null
member.age.in(10, 20) // in (10,20)
member.age.notIn(10, 20) // 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%'
member.username.contains("member") // like ‘%member%’
member.username.startsWith("member") // like ‘member%
리스트 조회 결과 없으면 빈 리스트 반환
List<Member> result = queryFactory.selectFrom(member).fetch();
조회 결과가 1개일 때
Member member = queryFactory.selectFrom(member).fetchOne();
조회 결과가 없을 시 null 반환
조회 결과가 1개 이상일 때 NonUniqueResultException 발생
조회 결과 중 가장 처음 1개
Member member = queryFactory.selectFrom(member).fetchFirst();
페이징에서 사용
QueryResults<Member> results = queryFactory.selectFrom(member).fetchResults();
// total count
long total = results.getTotal();
// result
List<Member> members = results.getResults();
select절에 count만 존재
long count = queryFactory.selectFrom(member).fetchCount();
select절에 엔티티가 아닌 조회할 필드를 지정해준 경우 결과값은 Tuple
.asc() // 오름차순
.desc() // 내림차순
.nullLast() // null데이터 마지막으로
.nullFirst() // null데이터 처음으로
queryFactory
.selectFrom(member)
.orderBy(member.username.desc())
.offset(1) // 시작 위치
.limit(2) // 결과 개수
.fetch();
count가 필요할 때
QueryResults<Member> results = queryFactory
.selectFrom(member)
.orderBy(member.username.desc())
.offset(1)
.limit(2)
.fetchResults();
int offset = results.getOffset();
int limit = results.getLimit();
long count = reuslts.getTotal().size();
List<Member> members = results.getResults();
*count 쿼리가 실행되니 성능상 주의
*여러 테이블을 조인하는 경우 성능을 위해 count 전용 쿼리를 별도로 작성해야 함
JPQL이 제공하는 모든 집합 함수 제공
List<Tuple> tuples = queryFactory
.select(member.count(),
member.age.sum(),
member.age.avg(),
member.age.max(),
member.age.min())
.from(member)
.fetch();
group By와 having
.groupBy(item.price)
.having(item.price.gt(1000))
[SPRING] Querydsl | 프로젝션과 결과 반환 (0) | 2021.05.17 |
---|---|
[SPRING] Querydsl | 문법(2) 조인연산 (0) | 2021.04.30 |
[SPRING] Querydsl | queryDSL이란 (0) | 2021.04.29 |
[SPRING] JPA 활용2 | OSIV와 성능 최적화 (0) | 2021.04.21 |
[SPRING] JPA 활용2 | API 개발과 성능 최적화(2) (0) | 2021.04.21 |
댓글 영역