2017-02-06 1 views
0

Neu bei CB, ich versuche, es anstelle von nativen Abfragen zu verwenden. Der Grund ist, dass ich verschiedene Gruppierungen nach Situationen brauche. Hier ist, was ich bin reproduzieren müssen:Criteria Builder String basiert - Ausdruck quot als double - JPA

(1 - sum(field_1 [integer])::real/sum (field_2 [integer])::real ) * 100 

Hier ist der Code ist, die annehmen, dass das tun:

Expression<Double> filed1Sum = cb.sumAsDouble(report.<Float>get("field1")); 
Expression<Double> filed2Sum = cb.sumAsDouble(report.<Float>get("field2")); 
Expression<Double> expected = cb.toDouble(cb.<Float>quot(filed1Sum, filed2Sum)); 

Das Problem ist: der erwartete Wert kommt wie lange !!! Da Feld1 immer kleiner ist als Feld2, habe ich 0 (Null). Ich frage mich, 0.888 so etwas zu bekommen.

+0

zu helfen Was ist das _string bedeuten based_ Sie in den Titel gesetzt haben? Sind 'field1' und' field2' numerische Java-Felder oder nicht? – perissf

+0

1 -String basiert Get ("String") im Gegensatz zu Metamodell basiert Get. (_ Class). –

+0

2 - Natürlich nicht. Sie sind INTEGER Datenbankfelder nicht Java –

Antwort

1

Ich habe durch die Multiplikation der Dividende von 1.0D gelöst:

Expression<Number> expected = cb.quot(cb.prod(filed1Sum,cb.literal(1.0D)), filed2Sum); 

, dass die Abfrage generiert:

(sum(field1) * 1.0)/sum(field2) 

Welche richtig gibt einen Floating-Point. Keine expliziten Konvertierungen erforderlich.

Vielen Dank für die Bemühungen, mich

Verwandte Themen