developer tip

JPQL Select 문에서 새 개체 만들기-피하거나 포용 하시겠습니까?

copycodes 2020. 12. 3. 08:03
반응형

JPQL Select 문에서 새 개체 만들기-피하거나 포용 하시겠습니까?


최근에 JPQL다음과 같이 문 에서 새 개체를 만들 수 있다는 것을 배웠습니다 .

select new Family(mother, mate, offspr)
from DomesticCat as mother
    join mother.mate as mate
    left join mother.kittens as offspr

이것은 피해야 할 것인가 아니면 포용해야 할 것인가? 모범 사례에 비추어이 기능의 사용이 언제 정당화됩니까?


피하지 마십시오 . §10.2.7.2 에서 알 수 있듯이 완벽하게 유효한 사용 사례가 있기 때문에 SELECT NEW가 있습니다 . EJB 3.0 JPA 사양 의 SELECT 절 에있는 JPQL 생성자 표현식 :

하나 이상의 Java 인스턴스를 리턴하기 위해 SELECT 목록에서 생성자를 사용할 수 있습니다. 지정된 클래스는 엔티티이거나 데이터베이스에 매핑 될 필요가 없습니다. 생성자 이름은 완전한 이름이어야합니다.

엔터티 클래스 이름이 SELECT NEW 절에 지정되면 결과 엔터티 인스턴스는 새 상태가됩니다.

SELECT NEW com.acme.example.CustomerDetails(c.id, c.status, o.count)
FROM Customer c JOIN c.orders o
WHERE o.count > 100

요컨대, 전체 엔티티 또는 개체의 전체 그래프를 유형 안전 방식으로 검색하지 않으려는 경우 SELECT NEW를 사용하십시오 ( Object[]). 쿼리 결과를 엔터티 클래스 또는 매핑되지 않은 클래스에 매핑할지 여부는 선택 항목에 따라 다릅니다. 일반적인 예는 목록 화면 (모든 세부 정보를 원하지 않을 수 있음)입니다.

즉, 모든 곳에서 사용하지 말고 사용을 금지하지 마십시오 (검은 색 또는 흰색 만있는 것은 거의 없음).


데이터 전송 개체 를 검색 할 때 이러한 종류의 쿼리를 자주 사용합니다 . 보고서는 사용하기에 좋은 곳이 될 수 있습니다. ( 대신 Family에서 와 같이) 단일 도메인 개체를 검색하려는 경우 에는 사용할 이유가 없습니다.


new로 생성 된 개체는 DTO, 즉 비즈니스 계층에서 내보낼 개체 일 필요가 없습니다. POJO 도메인 개체, 즉 비즈니스 계층에서 내부적으로 사용하는 개체 일 수도 있습니다.

이러한 종류의 POJO를 전체 JPA 엔티티 대신 부분 객체로 사용하는 이유는 특정 종류의 JOINS에서의 성능 때문입니다. 이를 설명하는 훌륭한 리소스는 다음과 같습니다. http://use-the-index-luke.com/sql/join/hash-join-partial-objects

참고 URL : https://stackoverflow.com/questions/2355728/jpql-create-new-object-in-select-statement-avoid-or-embrace

반응형