Querydsl에서는 from절의 서브쿼리를 지원하지 않는다.
서브쿼리 entity를 생성하여 사용할 수 있다.
구독자 테이블이 있고, 구독자 수가 많은 순서로 목록를 정렬하고 싶을 때
follower count 서브쿼리
package domain.subqueries;
import javax.persistence.Entity;
import javax.persistence.Id;
import lombok.Getter;
import org.hibernate.annotations.Immutable;
import org.hibernate.annotations.Subselect;
import org.hibernate.annotations.Synchronize;
@Entity
@Subselect(
" select user_id"
+ " , count(*) as follower_count"
+ " from user_follower"
+ " group by user_id"
)
@Immutable
@Synchronize({"UserFollower"})
@Getter
public class UserFollowerCount {
@Id
private Long userId;
private Long followerCount;
}
- @Immutable read-only
- @Synchronize 해당 subquery가 접근하는 테이블 정의
- 지정한 테이블에 변경사항이 있으면 로딩하기 전 flush() 실행
Querydsl repository
public List<User> getUser(Pageable pageable) {
QUserFollowerCount USER_FOLLOW_COUNT = QUserFollowerCount.userFollowerCount ;
List<User> results = jpaQueryFactory
.select(USER.userId, User.userName)
.from(USER)
.leftJoin(USER_FOLLOW_COUNT)
.on(USER.userId.eq(USER_FOLLOW_COUNT.userId))
.orderBy(USER_FOLLOW_COUNT.followerCount.desc())
.offset(pageable.getOffset())
.limit(pageable.getPageSize())
fetch();
return results;
}
Query
select
user.user_id
user.user_name
from
user
left outer join
(
select
user_id,
count(*) as follower_count
from
user_follower
group by
user_id
) followers
on (
user.user_id = followers.user_id
)
where
followers.follower_count desc'개발 > Spring' 카테고리의 다른 글
| [SpringBoot] 이메일 전송(텍스트, html) (0) | 2023.09.04 |
|---|---|
| [Querydsl] Querydsl 설정과 jsp 에러 (0) | 2023.08.17 |
| [JPA] flush(), clear() (0) | 2023.03.28 |
| [JPA] API 조회 기능 개발 정리 (0) | 2023.03.28 |
| [JPA] 연관관계 설정 예시 (0) | 2023.03.28 |