2011-01-11 3 views
3

私はHibernateを使用しており、結果に対して基本的な算術関数を実行する必要があります。ここに私の状況です:特定の行を含むHibernateと算術

私はodometerfuelを保存しており、fuelEconomyを計算したいと思います。しかしそれを行うには、先の結果から来た先のodometerの読書を知る必要があります。ここにイラストがあります。

表:

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 */ 
} 

私は基準でこれを達成することができますか私はHQLクエリに頼らなければならないでしょうか?それとも、これは別のレイヤーにまとめて残したほうが良いでしょうか?

答えて

1

私はそれをやり直すでしょう。私は、データベース内で開始走行距離計の値を格納しますし、私はどのように多くのKM(またはマイル)を格納します旅行がかかりました:

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

その後、あなたはJavaクラスとしてこれを持っていると思います:

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

これは、通常、銀行口座の通貨取引を記録するのと同じ手法です。隙間や矛盾を避けるためには、「開始」が常に前の開始+以前のトリップと同じであることを確認する必要があるという唯一の問題があります。

考えられるのは、このクラスのインスタンスは、有効なインスタンスであるために他のインスタンスに依存してはならないということです。

私はこの場合有効ではないと考えられる別の解決策は、ログに「シーケンス番号」をインデックスとして格納することです。例えば:

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

Carが、その後、責任を負うものであろう:

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

その後、あなたは、Hibernateにインデックス付きリストとしてマッピングFuelLogのコレクションを含むJavaクラスを、持っていると思います特定のログエントリの燃費を計算するために、以前のログエントリにアクセスすることができます。しかし、FuelLogにはfuelEconomyは含まれません。

+0

これは私に良いヒントを与えました。私は今のところサービス層に計算を置くかもしれません。私は何が変更されたかに応じて多くの行を再計算しなければならないので、挿入時に何かを計算することに夢中ではない。私のdb状態は私のアプリケーションに依存するので、エラーのための余地を残しているようだ。第2のアプローチはより良いですが、私は自分の車がFuelLogsの内部​​を知らないことを好むでしょう。たぶん私は自分のSQLをブラッシュアップし、トリガを作成することができます。 –

関連する問題