2014-12-12 10 views
5

Sto cercando di usare JODA classe denaro con i tipi Jadira per gestire la mappatura di Hibernate 4.Somma di denaro Joda diviso in 2 colonne con la primavera dati JPA

Sta funzionando bene (tranne che sto ricevendo troppi campi valutari).

Ma ho bisogno di costruire una query aggregata per sommare alcuni totali.

Questa è la dichiarazione del tipo.

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

E io sto cercando di definire una query, qualcosa come:

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

Esiste un modo per aggregare query in un campo di denaro utilizzando il JPQL?

Grazie.

+0

Quindi, il risultato del tuo tentativo è un segreto top secret? :) –

+0

Questo è stato un po 'di tempo fa, a dire il vero non ho idea di come l'ho risolto alla fine. Non posso ricordarlo. Probabilmente ho finito per iterarlo in codice perché non penso ci fosse alcuna soluzione imminente - o forse potrei anche aver abbandonato del tutto il tipo di Joda Money e passato ai decimali e qualche middleware pre/post per gestire un campo di valuta separato . –

+0

@Richard È possibile pubblicare la query esatta con gli attributi da Money che si desidera esporre?Grazie –

risposta

3

Ci sono due modi, ma sono limitate e dubito vi piace davvero li :( Il limite principale è che in Hibernate HQL non si può invocare metodi meno che non siano mappati proprietà -. Fine della storia Hibernate fa non supporta Method Invocation

D'altra parte è possibile mappare una colonna tutte le volte che si desidera, purché si ricordi che solo una singola mappatura può essere aggiornabile. Tenendo presente questo Il primo passo è che è necessario fai in modo che l'Hibernate sia a conoscenza dello joda Denaro. Ovviamente non puoi limitarti ad annotarlo. Ci sono due modi per farlo:

  1. È possibile utilizzare XML per annotare effettivamente la classe Money come classe @Embeddable. La configurazione dell'ibernazione XML può essere utilizzata per configurare qualcosa che è closed source. Da quello che vedo in Money joda - configurazione temporale.

  2. La seconda soluzione. Probabilmente quello che userei. È quello di avvolgere la classe Money in un wrapper dichiarato come @Embeddable. Questo wrapper incorporato è possibile definire più mapping per le colonne del database esistenti. Quando si imposta un valore su WRAPER, questo valore verrà trasferito al valore di soda Money che si trova all'interno.

Una volta eseguita questa operazione è possibile esporre attraverso il wrapper qualsiasi attributo della classe Money che si desidera e fare qualsiasi aggregazione desiderata.

@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; 
} 

Come risultato di questa mappatura si può fare una query come:

@query (value = "select select sum (oi.total.totalCurrency) da OrderItem oi cui oi.order =? 1 ")

+0

Non sto più lavorando su questo progetto, se Andreas, il tizio che ha pubblicato il premio dice che va bene, sono felice di accettare la risposta. –

+0

grazie per quell'input, vorrei assegnare la taglia se possibile –

Problemi correlati