https://tecoble.techcourse.co.kr/post/2021-08-08-basic-querydsl/
세팅법
public interface PostCustomRepository
public class PostCustomRepositoryImpl implements PostCustomRepository
@Repository
public class PostCustomRepositoryImpl implements PostCustomRepository {
private final JPAQueryFactory jpaQueryFactory;
public PostCustomRepositoryImpl(JPAQueryFactory jpaQueryFactory) {
this.jpaQueryFactory = jpaQueryFactory;
}
@Override
public List<Post> findAllInnerFetchJoin() {
return jpaQueryFactory.selectFrom(post)
.innerJoin(post.comments)
.fetchJoin()
.fetch();
}
@Override
public List<Post> findAllInnerFetchJoinWithDistinct() {
return jpaQueryFactory.selectFrom(post)
.distinct()
.innerJoin(post.comments)
.fetchJoin()
.fetch();
}
}
public interface PostRepository extends JpaRepository<Post, Long>, PostCustomRepository
spring data jpa와 사용하지 않는다면 그냥 인터페이스를 사용하지 않고 직접 클래스에서 정의할 수도 있다
아래는 join 없는 단순 JPQL을 QueryDSL로 변경한 예시이다
@BeforeEach
void before(){
Team teamA = new Team("teamA");
Team teamB = new Team("teamB");
teamRepository.save(teamA);
teamRepository.save(teamB);
Member member1 = new Member("member11", 10, teamA);
Member member2 = new Member("member12", 15, teamB);
Member member3 = new Member("member21", 20, teamB);
Member member4 = new Member("member22", 25, teamB);
memberRepository.save(member1);
memberRepository.save(member2);
memberRepository.save(member3);
memberRepository.save(member4);
}
@Test
void queryDslTest2(){
List<String> memberNames = jpaQueryFactory.select(member.username).from(member).
where(member.username.contains("2").and(member.age.gt(15))).
orderBy(member.username.desc()).
fetch();
assertThat(memberNames.get(0)).isEqualTo("member22");
assertThat(memberNames.get(1)).isEqualTo("member21");
}