728x90
반응형
Query DSL 기초
2022.06.24 - [Spring/Querydsl] - Query DSL 시작하기
Query DSL 시작하기
참고 Querydsl 기본문법 학습하기 Querydsl 다이나믹 쿼리 사용하기JPA와 비교 JPA 비교해 JPA의 장점 가독성이 좋다. JPA에서 기본적으로 제공하는 기능을 넘어서는 기능은 일반적으로 native query 옵션으
twer.tistory.com
Query DSL JOIN
2022.07.03 - [Spring/Querydsl] - Query DSL - Join
Query DSL - Join
첫 번째 파라미터에 조인 대상을 지정하고, 두 번째 파라미터에 별칭으로 사용할 Q 타입 지정 DB Team Table Member Table 기본 조인 join(조인 대상, 별칭으로 사용할 Q타입) join(), innerJoin() : 내부 조인..
twer.tistory.com
- com.querydsl.jpa.JPAExpressions 사용
- subquery는 가능한 한 join으로 변경하는 것이 좋다.
- 비즈니스 로직은 Service 계층에서 해결하는 것이 좋다.
- 데이터 포맷은 View 계층에서 해결하는 것이 좋다.
DB
- Team Table
- Member Table
select 절의 subquery
@Repository
public class MemberRepositorySupport extends QuerydslRepositorySupport {
private final JPAQueryFactory queryFactory;
public MemberRepositorySupport(JPAQueryFactory queryFactory) {
super(Member.class);
this.queryFactory = queryFactory;
}
public List<Tuple> findMemberSelectSubquery(){
return queryFactory
.select(member.name,
JPAExpressions.select(member.age.avg()).from(member)
)
.from(member)
.fetch();
}
}
/* ======================= */
@SpringBootTest
class MemberRepositorySupportTest {
@Autowired
private MemberRepositorySupport memberRepositorySupport;
@Test
void select_subquery(){
List<Tuple> memberSelectSubquery = memberRepositorySupport.findMemberSelectSubquery();
for(Tuple tuple : memberSelectSubquery){
System.out.println(tuple);
}
}
}
/* ======================= */
/*
결과
[test1, 14.0]
[test2, 14.0]
[test3, 14.0]
*/
from 절의 subquery
- JPA, JPQL 에서는 from 절의 서브쿼리를 지원하지 않는다.
- querydsl은 JPQL의 빌더 역할이기 때문에 JPQL이 지원하지 않는 문법은 사용할 수 없다.
where 절의 subquery
- eq() 사용
- goe() 사용 (>= 함수)
- in() 사용
@Repository public class MemberRepositorySupport extends QuerydslRepositorySupport { private final JPAQueryFactory queryFactory; public MemberRepositorySupport(JPAQueryFactory queryFactory) { super(Member.class); this.queryFactory = queryFactory; } // eq() 사용 public Member findMemberWhereSubqueryEq(){ return queryFactory .selectFrom(member) .where(member.age.eq( JPAExpressions .select(member.age.max()) .from(member)) ) .fetchOne(); } // goe() 사용 (>=함수) public List findMemberWhereSubqueryGoe(){ return queryFactory .selectFrom(member) .where(member.age.goe( JPAExpressions .select(member.age.avg()) .from(member) )) .fetch(); } // in() 사용 public List findMemberWhereSubqueryIn(){ return queryFactory .selectFrom(member) .where(member.age.in( JPAExpressions .select(member.age) .from(member) .where(member.age.gt(10)) )) .fetch(); } } /* ======================= */ @SpringBootTest class MemberRepositorySupportTest { @Autowired private MemberRepositorySupport memberRepositorySupport; @Test void where_subquery(){ // 가장 나이가 많은 회원 - eq() Member memberWhereQueryEq = memberRepositorySupport.findMemberWhereSubqueryEq(); System.out.println("eq : " + memberWhereQueryEq.getName()); // 평균 나이 이상의 회원리스트 - goe() List<Member> memberWhereSubqueryGoe = memberRepositorySupport.findMemberWhereSubqueryGoe(); for (Member member : memberWhereSubqueryGoe){ System.out.println("goe : " + member.getName()); } // 10살 이상 - in() List<Member> memberWhereSubqueryIn = memberRepositorySupport.findMemberWhereSubqueryIn(); for(Member member : memberWhereSubqueryIn){ System.out.println("in : " + member.getName()); } } } /* ======================= / / 결과 eq : test2 goe : test2 in : test2 in : test3 */
참고
https://hjhng125.github.io/querydsl/querydsl-subquery/
제주삼다수 그린
COUPANG
www.coupang.com
파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음
반응형
'Spring > Querydsl' 카테고리의 다른 글
Query DSL 시작하기 (0) | 2022.12.12 |
---|---|
Query DSL - Dynamic Query (0) | 2022.07.06 |
Query DSL - Paging (0) | 2022.07.06 |
Query DSL - CASE (0) | 2022.07.05 |
Query DSL - Join (0) | 2022.07.03 |