Hibernate和涉及特定行的算术

Hibernate和涉及特定行的算术,hibernate,hibernate-criteria,Hibernate,Hibernate Criteria,我正在使用Hibernate,需要对结果执行一个基本的算术函数。我的情况如下: 我正在存储里程表和燃油并想计算燃油经济性。但要做到这一点,我需要知道前面的里程表读数,它将来自前面的结果。这是一个例子 表: ODOMETER | FUEL 65000.0 | 5.000 65500.0 | 15.000 POJO: 我可以用条件来实现这一点,还是必须求助于HQL查询?还是把它放在一个不同的层上比较好?我会做不同的事情。我会将起始里程表值存储在数据库中,并存储行程所需的公里数: START |

我正在使用Hibernate,需要对结果执行一个基本的算术函数。我的情况如下:

我正在存储
里程表
燃油
并想计算
燃油经济性
。但要做到这一点,我需要知道前面的
里程表读数,它将来自前面的结果。这是一个例子

表:

ODOMETER | FUEL
65000.0  | 5.000
65500.0  | 15.000
POJO:


我可以用条件来实现这一点,还是必须求助于HQL查询?还是把它放在一个不同的层上比较好?

我会做不同的事情。我会将起始里程表值存储在数据库中,并存储行程所需的公里数:

START |  TRIP | FUEL
60000 |  5000 | 5.0
65000 | 15000 | 15.0
然后,您可以将其作为Java类:

public class FuelLog {
  private double start;
  private double trip;
  private double fuel;
}
例如,这是通常用于记录银行账户货币交易的相同技术。唯一的问题是,您必须确保“开始”始终等于上一次开始+上一次行程,以避免间隙和/或不一致

其思想是该类的实例不应依赖于其他实例成为有效实例

另一种可能的解决方案是将“序列号”作为索引存储在日志中,我认为这在本例中是无效的。例如:

START |  TRIP | FUEL | INDEX
60000 |  5000 | 5.0  | 1
65000 | 15000 | 15.0 | 2
然后,您将拥有一个Java类,其中包含
fuelog
的集合,映射为Hibernate中的索引列表:

public class Car {
  private List<FuelLog> fuelLog;
  public double getFuelEconomy(FuelLog log){/* your implementation goes here */}
}
公车{
私人名单;
公共双getFuelEconomy(fuelog log){/*您的实现在这里*/}
}

Car
将负责计算特定日志条目的燃油经济性,因为它可以访问以前的日志条目。但是,您的
fuelog
中不会有
fuelEconomy

这给了我一些很好的建议。我现在可以把计算放在服务层。我并不热衷于在insert上计算一些东西,因为根据修改的内容,我可能最终不得不重新计算很多行。由于我的数据库状态取决于我的应用程序,因此似乎留有出错的余地。第二种方法更好,但我更喜欢让我的车不知道燃油OGS的内部。也许我可以重温一下我的sql并创建一个触发器。
public class Car {
  private List<FuelLog> fuelLog;
  public double getFuelEconomy(FuelLog log){/* your implementation goes here */}
}