2011-01-11 11 views
3

Ich verwende Hibernate und muss eine grundlegende arithmetische Funktion für die Ergebnisse durchführen. Hier ist meine Situation:Hibernate und Arithmetik mit bestimmten Zeilen

Ich speichere odometer und fuel und möchte fuelEconomy berechnen. Aber um das zu tun, muss ich die vorherige odometer lesen, die aus dem vorherigen Ergebnis kommen würde. Hier ist eine Illustration.

Tabelle:

ODOMETER | FUEL 
65000.0 | 5.000 
65500.0 | 15.000 

POJO:

public class FuelLog { 
    private double odometer; 
    private double fuel; 
    private double fuelEconomy; 

    /* Getters and Setters */ 
} 

Kann ich erreichen dies mit Kriterien oder hätte ich auf eine HQL-Abfrage greifen? Oder wäre das besser zusammen auf einer anderen Ebene?

Antwort

1

Ich würde es anders machen. Ich würde den Startkilometerstand in der Datenbank speichern, und ich würde speichern, wie viele Kms (oder Meilen) die Fahrt dauerte:

START | TRIP | FUEL 
60000 | 5000 | 5.0 
65000 | 15000 | 15.0 

Dann Sie diese als Java-Klasse haben würde:

public class FuelLog { 
    private double start; 
    private double trip; 
    private double fuel; 
} 

Dies ist die gleiche Technik, die normalerweise für die Aufzeichnung von Geldtransaktionen für Bankkonten verwendet wird. Das einzige Problem ist, dass Sie sicherstellen müssen, dass "Start" immer gleich dem vorherigen Start + vorherige Reise ist, um Lücken und/oder Inkonsistenzen zu vermeiden.

Die Idee ist, dass eine Instanz dieser Klasse nicht davon abhängen sollte, dass andere Instanzen eine gültige Instanz sind.

Eine andere mögliche Lösung, die ich in diesem Fall nicht für gültig halte, wäre, die "Sequenznummer" im Protokoll als Index zu speichern. Zum Beispiel:

START | TRIP | FUEL | INDEX 
60000 | 5000 | 5.0 | 1 
65000 | 15000 | 15.0 | 2 

Dann würden Sie eine Java-Klasse haben, die eine Sammlung von FuelLog enthält, als eine indizierte Liste in Hibernate abgebildet:

public class Car { 
    private List<FuelLog> fuelLog; 
    public double getFuelEconomy(FuelLog log){/* your implementation goes here */} 
} 

Car würde dann derjenige sein, der verantwortlich um den Kraftstoffverbrauch für einen bestimmten Protokolleintrag zu berechnen, da er auf die vorherigen Protokolleinträge zugreifen kann. Aber dann würden Sie die fuelEconomy in Ihrem FuelLog nicht haben.

+0

Das gab mir ein paar gute Tipps. Ich kann die Berechnung vorerst in die Service-Schicht legen. Ich bin nicht verrückt nach etwas auf dem Einsatz zu berechnen, da ich am Ende viele Zeilen neu berechnen müsste, abhängig davon, was geändert wurde. Scheint Raum für Fehler zu lassen, da mein DB-Zustand von meiner App abhängig sein würde. Der zweite Ansatz ist besser, aber ich würde es bevorzugen, wenn mein Auto die Innereien von FuelLogs nicht bemerkt. Vielleicht könnte ich auf meinem SQL auffrischen und einen Trigger erstellen. –