【问题标题】:Java Class variable's declaration from other variableJava 类变量从其他变量的声明
【发布时间】:2017-08-18 22:21:50
【问题描述】:

我有一个 java 域类,它为数据库中的一个表建模,我有两个字段 双倍预算1 双倍预算 2 我需要在类中添加另一个字段作为成员变量 double totalBudget 是budget1 和budget2 的一部分,我如何在java8 中做到这一点?

@Formula("(SELECT SUM(c.budget1) FROM table1)
private Double budget1;

@Formula("(SELECT SUM(c.budget2) FROM table2)
private Double budget2;

@Transient
private Double totalBudget = budget1 + budget2;

这给了我一个错误

【问题讨论】:

  • 这段代码给你的错误是什么?
  • 引起:org.hibernate.InstantiationException:无法实例化测试对象
  • 你确定你真的需要那个字段吗?我会使用一种返回它们的总和的方法。请记住,每次更改 budget1budget2 时,您都应该更新 totalBudget
  • @Kanub,请添加完整的堆栈跟踪
  • 你不想这样做。 (1) 你应该在数据库中使用BigDecimal,而不是Double,用于金钱和DECIMAL; (2) 您不想要一个可以从其他字段推断出其值的字段。您只需要一个返回值总和的字段的 getter。否则 (3) 如果对象是不可变的,您希望在获取这些值的 SQL 语句中计算总和。

标签: java hibernate


【解决方案1】:

您不需要可以从其他字段推断其值的字段。您应该使用没有字段的 getter:

public Double getTotalBudget()
{
    return budget1+budget2;
}

或者如果对象是不可变的,即使是查询:

@Formula("(SELECT SUM(c.budget1)+SUM(c.budget2) FROM table2)")
private Double totalBudget;

当然,您应该使用BigDecimal,而不是Double,用于赚钱,并在数据库中使用DECIMAL

【讨论】:

  • 运行总和查询将是一个非常糟糕的主意
  • 在休眠状态下,当他获取对象时,它已经被填充了。为什么要额外计算?
  • @PritamBanerjee 是的,它已经填充了三个查询的结果。计算必须在某个地方完成。
  • 不如他先得到另外两个字段,然后得到totalBudget
  • @PritamBanerjee“非常糟糕的主意”和“更好”不是事实陈述或论据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-06
  • 2012-08-27
  • 2018-02-03
  • 1970-01-01
相关资源
最近更新 更多