source

계산된 속성을 JPA 및 최대 절전 모드로 매핑하는 방법

factcode 2022. 9. 20. 23:51
반응형

계산된 속성을 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;

어디에idid현재 엔티티의

다음 블로그 투고는 읽을 가치가 있습니다.하이버네이트 파생 속성 - 퍼포먼스와 휴대성.

자세한 내용이 없으면 더 정확한 답변을 드릴 수 없지만 위의 링크는 도움이 될 것입니다.

다음 항목도 참조하십시오.

다음의 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

반응형