728x90
반응형
1. 의존성 주입
QueryDsl EntityManager 를 전역으로 의존성을 주입해주기 위해 다음을 만들어준다.
@Configuration
public class QueryDslConfig {
@PersistenceContext
private EntityManager entityManager;
@Bean
public JPAQueryFactory jpaQueryFactory() {
return new JPAQueryFactory(entityManager);
}
}
그 다음 Repository에서 다음과 같이 깔끔하게 해줄 수 있다.
@Repository
@RequiredArgsConstructor
public class PostCustomRepositoryImpl implements PostCustomRepository {
private final JPAQueryFactory jpaQueryFactory;
2. 2번 이상의 Depth로 JoinFetch 할 경우
JPQL 같은 경우는 Join Fetch를 여러번 타고 갈 때
select u from User u join fetch u.team t join fetch t.site
이런 식으로 가지만, QueryDsl 같은 경우는
query
.selectFrom(user)
.leftJoin(user.team, team)
.leftJoin(team.site, site)
이런식으로 타고가야 한다.
3. 같은 객체를 2번 사용할 경우 ( 같은 query 내에 같은 객체를 다른 곳에서도 Join 할 경우 )
var a = new QUser("testUser");
var b = new QUser("sequenceUser");
이런 식으로 Q객체를 변수로 할당하여 사용하면 된다.
4. 메소드화
public JPAQuery<User> findUser() {
return query
.selectFrom(user)
.leftJoin(user.team, team)
.leftJoin(team.site, site);
}
이런 식으로 Query 메소드를 분리할 수도 있다.
5. Optional 사용
public Optional<JPAQuery<User>> findUser() {
return Optional.ofNullable(query
.selectFrom(user)
.leftJoin(user.team, team)
.leftJoin(team.site, site)
.fetchFirst());
}
Optinal 을 사용하여 아래와 같이 NoSuchElementException을 던질 수도 있다.
public User findLatestOne() {
return findUser().orElseThrow();
}
6. Optional 사용 2
fetch종류에 따라 메소드를 분할 할 경우 아래와 같이 사용 할 수 도 있다.
public JPAQuery<User> findUser() {
return query
.selectFrom(user)
.leftJoin(user.team, team)
.leftJoin(team.site, site)
.fetchFirst();
}
public User findLatestOne() {
return Optional.ofNullable(findUser().fetchFirst()).orElseThrow();
}
public List<User> findUsers() {
return findUser().fetch();
}
728x90
반응형
'Back-End > Spring Boot' 카테고리의 다른 글
Spring Boot | Converter 사용법 (0) | 2023.05.30 |
---|---|
SpringBoot | List to DtoList ( Stream ) (0) | 2023.05.18 |
Spring Boot | Jpa Enum Column value로 저장하기, name으로 조회하기 ( feat. 상속관계 ) (0) | 2023.05.04 |
Spring Boot | Jpa Postgres Json Column (0) | 2023.05.03 |
Spring Boot | Java Map 반복문 쓰는법 (0) | 2023.04.19 |