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
'developer tip' 카테고리의 다른 글
두 개의 큰 정수를 곱하는 동안 오버플로를 잡아서 계산 (0) | 2020.12.03 |
---|---|
참조 주소를 찾을 수있는 방법이 있습니까? (0) | 2020.12.03 |
jQuery를 사용하여 부모 요소를 삭제하는 방법 (0) | 2020.12.03 |
하위 배열 값을 사용하여 알파벳순으로 PHP 정렬 배열 (0) | 2020.12.03 |
Android에서 사용자 지정 단추가있는 사용자 지정 작업 모음을 구현하려면 어떻게해야합니까? (0) | 2020.12.03 |