Notice
Recent Posts
Recent Comments
Link
DevKim
[Querydsl] 기본 문법 - 검색 조건 쿼리, 정렬, 페이징, 집합 본문
728x90
[ 기본 검색 조건 ]
검색 조건은 .and() .or()를 매서드 체인으로 연결할 수 있다.
queryFactory
.selectFrom(member)
.where(member.username.eq("member1")
.and(member.age.eq(10)))
.fetchOne();
where문의 경우 ','로 연결해도 모두 and로 인식해주기 때문에 아래와 같이 사용해된다고한다.
queryFactory
.selectFrom(member)
.where(member.username.eq("member1"),
member.age.eq(10))
.fetchOne();
JPQL이 제공하는 모든 검색 조건 제공한다.
1. == & null 여부
.eq("member1")
.ne("member1") //== .eq("member1").not()
.isNotNull()
2. in절, between 절
.in(10,20)
.notIn(10,20)
.between(10,30)
3. 대소비교
age.goe(30) //age>=30
age.gt(30) //age>30
age.loe(30) //age<=30
agd.lt(30) //age<30
4. like 조건
.like("member%")
.contains("member") //%member%
.startWith("member") //member%
[ 결과 조회 ]
1. fetch( )
-리스트 조회
List<Member> fetch = queryFactory
.selectFrom(member)
.fetch();
2. fetchOne( )
- 단건 조회
Member fetchOne = queryFactory
.selectFrom(member)
.fetchOne();
3. fetchFirst( )
- 데이터 1개만 조회
(=limit(1).fetchone() 과 동일)
Member fetchFirst = queryFactory
.selectFrom(QMember.member)
.fetchFirst();
4. fetchResults( )
- 페이징 정보 포함
- total count 쿼리 추가 실행
QueryResults<Member> results = queryFactory
.selectFrom(member)
.fetchResults();
//total 제공
results.getTotal();
//getResults로 꺼내줘야 content가 나옴
List<Member> content = results.getResults();
5. fetchCount( )
- count 쿼리로 변경해서 count 수 조회
long count = queryFactory
.selectFrom(member)
.fetchCount();
[ 정렬 ]
List<Member> result = queryFactory
.selectFrom(member)
.where(member.age.eq(100))
.orderBy(member.age.desc(), member.username.asc().nullsLast())
.fetch();
* nullsLast( ) , nullsFirst( )
- null 데이터 순서 부여
[ 페이징 ]
//페이징 - 조회 건수 제한
@Test
public void paging1() { List<Member> result = queryFactory
.selectFrom(member)
.orderBy(member.username.desc())
.offset(1) //0부터 시작(zero index)
.limit(2) //최대 2건 조회
.fetch();
assertThat(result.size()).isEqualTo(2);
}
// 페이징 - 전체 조회수가 필요하다면?
@Test
public void paging2() {
QueryResults<Member> queryResults = queryFactory
.selectFrom(member)
.orderBy(member.username.desc())
.offset(1)
.limit(2)
.fetchResults();
assertThat(queryResults.getTotal()).isEqualTo(4);
assertThat(queryResults.getLimit()).isEqualTo(2);
assertThat(queryResults.getOffset()).isEqualTo(1);
assertThat(queryResults.getResults().size()).isEqualTo(2);
}
[ 집합 ]
- JPQL이 제공하는 모든 집합함수 제공
- COUNT,SUM,AVG,MAX,MIN
List<Tuple> result = queryFactory
.select(member.count(),
member.age.sum(),
member.age.avg(),
member.age.max(),
member.age.min())
.from(member)
.fetch();
[ groupBy ]
조건 : 팀의 이름과 각 팀의 팀원들의 평균 나이를 구하라
List<Tuple> result = queryFactory
.select(team.name,member.age.avg())
.from(member)
.join(member.team,team)
.groupBy(team.name)
.fetch();
* groupBy 뒤에 having 절로 결과를 제한할 수 있다 *
.groupBy(item.price)
.having(item.price.gt(1000))
728x90
'JPA' 카테고리의 다른 글
[Querydsl] Querydsl VS. JPQL (11) | 2021.07.21 |
---|---|
[Data JPA] 벌크성 수정쿼리, @EntityGraph (0) | 2021.07.01 |
[Data JPA] 페이징 성능 최적화 - Count 쿼리 분리하기 (0) | 2021.07.01 |
[Data JPA] 페이징과 정렬 (0) | 2021.07.01 |
[Data JPA] 쿼리 메소드 기능 (@Query, 파라미터 바인딩..등) (0) | 2021.07.01 |
Comments