public interface MemberRepositoryCustom {
List<MemberTeamDto> search(MemberSearchCondition condition);
}
public class MemberRepositoryImpl implements MemberRepositoryCustom {
private final JPAQueryFactory queryFactory;
public MemberRepositoryImpl(EntityManager em) {
this.queryFactory = new JPAQueryFactory(em);
}
@Override
public List<MemberTeamDto> search(MemberSearchCondition condition) {
...
}
@Repository
public class MemberQueryRepository {
private final JPAQueryFactory queryFactory;
public MemberRepositoryImpl(EntityManager em) {
this.queryFactory = new JPAQueryFactory(em);
}
@Override
public List<MemberTeamDto> searchForSomething(MemberSearchCondition condition) {
...
}
@Override
public Page<MemberTeamDto> searchPageSimple(MemberSearchCondition condition,
Pageable pageable) {
QueryResults<MemberTeamDto> results = queryFactory
.select(new QMemberTeamDto(
member.id,
member.username,
member.age,
team.id,
team.name))
.from(member)
.leftJoin(member.team, team)
.where(usernameEq(condition.getUsername()),
teamNameEq(condition.getTeamName()),
ageGoe(condition.getAgeGoe()),
ageLoe(condition.getAgeLoe()))
**.offset(pageable.getOffset()) // 어느 offset부터 시작할지 지정
.limit(pageable.getPageSize()) // 몇 개의 데이터를 가져오는지 지정
.fetchResults();**
// 모든 데이터 얻기
List<MemberTeamDto> content = results.getResults();
// 총 데이터 개수
long total = results.getTotal();
return new PageImpl<>(content, pageable, total);
}
Long totalCount = queryFactory
//.select(Wildcard.count) // select count(*) 와 같은 의미
.select(member.count()) //select count(member.id) 와 같은 의미
.from(member)
.fetchOne();