2014-12-12 5 views
5

내가 처리 할 수 ​​Jadira 유형과 JODA 돈 클래스를 사용하려고 해요 매핑 그것은 내가 너무 많이 받고 있어요 것을 제외하고 (괜찮 일하고 4.

를 최대 절전 모드로 스프링 데이터 JPA로 2 열로 분할 통화 필드).

하지만 전체 합계를 계산하려면 집계 쿼리를 작성해야합니다.

이것은 유형 선언입니다.

@Columns(columns = { @Column(name = "total_currency", length=10), @Column(name = "total") }) 
@Type(type = "org.jadira.usertype.moneyandcurrency.joda.PersistentMoneyAmountAndCurrency") 
private Money total; 

그리고 쿼리를 정의하기 위해 노력하고있어, 같은 :

@Query(value="select sum(oi.total) from OrderItem oi where oi.order = ?1") 
Double calculateSubtotal(Order order); 

JPQL를 사용하여 돈 필드에 대한 쿼리를 집계하는 방법이 있나요?

감사합니다.

+0

귀하의 시도 결과는 일급 비밀입니까? :) –

+0

이것은 얼마 전부터 솔직히 말해서 결국 어떻게 해결했는지 모르겠다. 나는 그것을 기억할 수 없다. 코드에 반복적 인 해결책을 찾지 못했을 것입니다. Joda Money 유형을 완전히 삭제하고 별도의 통화 필드를 관리하기 위해 십진수와 사전/사후 미들웨어로 전환 할 수도 있습니다. . –

+0

@ 리차드 노출하려는 Money의 특성을 가진 정확한 쿼리를 게시 할 수 있습니까?감사합니다. –

답변

3

이 두 가지 방법이 있습니다,하지만 그들은 제한하고 난 당신이 정말 그들처럼 의심 :( 주요 제한은 속성 매핑하지 않는 최대 절전 HQL에서이 메소드를 호출 할 수 없다는 것입니다 -. 이야기의 끝을 Hibernate는 않습니다 지원하지 않음 메서드 호출

반면에 하나의 매핑 만 업데이트 할 수 있다는 것을 기억하는 한 원하는만큼 하나의 열을 매핑 할 수 있습니다. 첫 번째 단계는 다음을 수행해야합니다. 최대 절전 모드에서 joda Money을 인식 할 수 있습니다. 분명히 주석을 달 수는 없습니다.이 작업을 수행하는 방법은 두 가지가 있습니다 :

  1. XML을 사용하여 실제로 Money 클래스에 @Embeddable 클래스로 주석을 추가 할 수 있습니다. XML Hibernate 설정은 닫힌 소스 인 것을 설정하는데 사용될 수 있습니다. 돈 조다 시간 구성에서 본 것.

  2. 두 번째 솔루션입니다. 아마 내가 사용할 것입니다. @Embeddable로 선언 된 래퍼에 Money 클래스를 래핑하는 것입니다. 이 내장 된 랩퍼를 사용하면 기존 데이터베이스 컬럼에 대해 다중 맵핑을 정의 할 수 있습니다. WRAPER에 값을 설정하면이 값은 내부에있는 소다 시간 Money로 푸시됩니다.

일단이 작업을 수행하면 래퍼를 통해 원하는 Money 클래스의 특성을 노출시키고 원하는 집계를 수행 할 수 있습니다. "오이 곳 oi.order OrderItem에에서 선택 합 (oi.total.totalCurrency를) 선택 =

@query (값 : 당신은 같은 쿼리를 할 수있는이 매핑의 결과로

@Embeddable 
public class MoneyWrapper { 


    @Columns(columns = { @Column(name = "total_currency", length=10), @Column(name = "total") }) 
    @Type(type = "org.jadira.usertype.moneyandcurrency.joda.PersistentMoneyAmountAndCurrency") 
    Money totalmoney; 


    @Column(name = "total",updateable=false,insterable=false); 
    BigDecimal total to agregate; 

    @Column(name = "total_currency",updateable=false,insterable=false); 
    BigDecimal totalCurrency; 
} 

=? 1 ")

+0

현상금을 게시 한 사람이 괜찮다고 말하면 안드레아스가 더 이상이 프로젝트를 진행하지 않습니다. 답변을 수락하게되어 기쁩니다. –

+0

그 입력에 감사드립니다. 가능하면 현상금을 수여하고 싶습니다. –