인프런 커뮤니티 질문&답변

백엔드 주니어 개발자님의 프로필 이미지

작성한 질문수

querydsl Embeddable 안에 Embeddable 조건안됨

작성

·

384

0

querydsl 로 조회를 할 때 where 조건절로
Embeddable 안에 Embeddable이 있을 경우 두번째 깊이 부터는 못들어가는 문제가 있는데 어떻게 해결하는 것이 좋은 방법인지 질문드립니다.

답변 2

1

안녕하세요, 인프런 AI 인턴이에요.

querydsl에서 Embeddable 안에 Embeddable이 있다면, 두 번째 깊이부터는 조회하는 것이 어려울 수 있습니다. 이 경우에는 특정한 방법을 사용하여 해결해야 합니다.

첫 번째로 고려해볼 수 있는 방법은, Embeddable 클래스 안에 있는 필드들을 펼쳐서 사용하는 것입니다. 이렇게 하면 두 번째 깊이 이후의 필드들도 바로 접근할 수 있게 됩니다. 다만, 이 방법은 코드의 가독성을 해칠 수 있으므로 신중하게 사용해야 합니다.

두 번째로 고려해볼 수 있는 방법은, JPA의 @Query 어노테이션을 사용하여 직접 JPQL을 작성하는 것입니다. Embeddable 안에 Embeddable이 있다면, 필드 경로를 명시적으로 작성하여 쿼리를 작성할 수 있습니다.

세 번째로 고려해볼 수 있는 방법은, Querydsl이 제공하는 Expressions 클래스를 사용하여 임시로 필드들을 분리하는 것입니다. Embeddable 필드들을 Expressions 클래스를 사용하여 분리한 후에, 필요한 필드로 다시 조합하여 사용할 수 있습니다.

위의 방법들 중에서 적합한 방법을 선택하여 문제를 해결해보세요. 그리고 Querydsl 공식 문서나 관련 블로그 등을 참고하여 더 자세한 내용을 확인해보시는 것도 도움이 될 수 있어요. 제가 더 자세한 도움을 드리지 못해 죄송합니다.
더 궁금한 사항이 있다면 언제든지 물어보세요. 항상 도움을 드릴게요. 감사합니다.

0

QueryInit("*.*") 적용을 고려해보시길 바랍니다.

https://querydsl.com/static/querydsl/2.1.2/apidocs/com/mysema/query/annotations/QueryInit.html

 

By default Querydsl initializes only reference properties of the first two levels. In cases where longer initialization paths are required, these have to be annotated in the domain types via com.querydsl.core.annotations.QueryInit annotations. QueryInit is used on properties where deep initializations are needed. The following example demonstrates the usage.

@Entity
class Event {
    @QueryInit("customer.address")
    Account account;
}

@Entity
class Account {
    Customer customer;
}

@Entity
class Customer {
    String name;
    Address address;
    // ...
}

This example enforces the initialization of the account.customer path, when an Event path is initialized as a root path / variable. The path initialization format supports wildcards as well, e.g. "customer.*" or just "*".