계산된 속성을 JPA 및 최대 절전 모드로 매핑하는 방법
Java bean에는 childCount 속성이 있습니다.이 속성은 데이터베이스 열에 매핑되지 않았습니다.대신 Java bean과 그 자식의 결합으로 동작하는 함수로 데이터베이스에 의해 계산되어야 합니다.이 재산은 요구대로 계산될 수 있다면 더 좋겠지만, 이것은 강제 사항이 아닙니다.
최악의 경우 HQL이나 Criteria API를 사용하여 이 콩의 속성을 설정할 수 있지만, 저는 그렇게 하고 싶지 않습니다.
하이버네이트@Formula
주석은 도움이 될 수 있지만, 나는 문서를 거의 찾을 수 없었다.
아무쪼록 잘 부탁드립니다.감사합니다.
JPA는 파생 속성을 지원하지 않으므로 공급자별 확장을 사용해야 합니다.말씀하신대로,@Formula
하이버네이트를 사용할 때 최적입니다.SQL fragment를 사용할 수 있습니다.
@Formula("PRICE*1.155")
private float finalPrice;
또는 다른 테이블에 대한 복잡한 쿼리도 마찬가지입니다.
@Formula("(select min(o.creation_date) from Orders o where o.customer_id = id)")
private Date firstOrderDate;
어디에id
는id
현재 엔티티의
다음 블로그 투고는 읽을 가치가 있습니다.하이버네이트 파생 속성 - 퍼포먼스와 휴대성.
자세한 내용이 없으면 더 정확한 답변을 드릴 수 없지만 위의 링크는 도움이 될 것입니다.
다음 항목도 참조하십시오.
다음의 3가지 옵션이 있습니다.
- Atribute를 사용하여 Atribute를 계산하고 있는 경우
@Transient
방법 - 를 사용할 수도 있습니다.
@PostLoad
엔티티 리스너 - 또는 하이버네이트 고유의
@Formula
주석
휴지 상태에서는 JPA에서 @Formula를 사용할 수 있지만 @PostLoad 콜백을 사용하여 다음과 같은 계산 결과를 임시 속성에 입력할 수 있습니다.
@Column(name = "price")
private Double price;
@Column(name = "tax_percentage")
private Double taxes;
@Transient
private Double priceWithTaxes;
@PostLoad
private void onLoad() {
this.priceWithTaxes = price * taxes;
}
그래서 당신은 하이버네이트를 사용할 수 있습니다.@Formula
다음과 같습니다.
@Formula("""
round(
(interestRate::numeric / 100) *
cents *
date_part('month', age(now(), createdOn)
)
/ 12)
/ 100::numeric
""")
private double interestDollars;
JPA를 기반으로 동작하며 퍼스트 클래스 DTO 지원을 제공하는 Blaze-Persistence Entity Views를 살펴보십시오.엔티티 뷰 내의 속성에 어떤 것이든 투영할 수 있으며 가능하면 기존 결합 노드를 연결에 재사용할 수도 있습니다.
다음은 매핑 예시입니다.
@EntityView(Order.class)
interface OrderSummary {
Integer getId();
@Mapping("SUM(orderPositions.price * orderPositions.amount * orderPositions.tax)")
BigDecimal getOrderAmount();
@Mapping("COUNT(orderPositions)")
Long getItemCount();
}
이 쿼리를 가져오면 이와 유사한 JPQL/HQL 쿼리가 생성됩니다.
SELECT
o.id,
SUM(p.price * p.amount * p.tax),
COUNT(p.id)
FROM
Order o
LEFT JOIN
o.orderPositions p
GROUP BY
o.id
커스텀 서브쿼리 프로바이더에 관한 블로그 투고입니다.이러한 투고는 고객님께도 흥미로울 수 있습니다.https://blazebit.com/blog/2017/entity-view-mapping-subqueries.html
언급URL : https://stackoverflow.com/questions/2986318/how-to-map-calculated-properties-with-jpa-and-hibernate
'source' 카테고리의 다른 글
javac : 명령어를 찾을 수 없습니다. (0) | 2022.09.20 |
---|---|
공통의 목표를 가진 새로운 앱을 빠르게 구축할 수 있도록 sails.js 스켈레톤을 작성하는 방법 (0) | 2022.09.20 |
소수점 이하를 2배로 이동 (0) | 2022.09.20 |
JPA의 @Basic(옵션 = false) vs @Column(nullable = false) (0) | 2022.09.20 |
Typescript에서 유형을 확장할 수 있습니까? (0) | 2022.09.20 |