Hibernate - BigDecimal映射精度

8
问题:我的映射类在从Oracle数据库获取值时,似乎会丢失0,比如50.20的值。如果是50.23,则可以正确获取该值,但任何以0结尾的值都无法获取。我想这可能是我遗漏了一些简单的东西。有什么建议吗?先谢谢了。 详情: 数据库:Oracle 11G 字段定义:Numeric(8,2)
映射Getter/Setter
    @Column ( name="PRICE", precision = 8, scale = 2 )
private BigDecimal price;

public BigDecimal getPrice()
{
    return price;
}
public void setPrice( BigDecimal price )
{
    this.price = price;
}

当我执行 hibernate 的 .getList 时,它获取的是 50.2 而不是数据库中的 50.20。我唯一能想到的是与字段映射有关。我还尝试将其转换为 double,但没有任何区别。 - haju
3个回答

8

50.2等同于50.20、50.200等。如果您想用两位小数显示它,请使用java.text.DecimalFormat.format(..)

指定精度限制的是最大小数位数,而不是最小位数。


1
但是为什么Hibernate要去掉它呢?在数据库中它是50.20,我认为我的映射类默认情况下不应该去掉尾随的0。 - haju
1
这只是一个表现问题。没有人裁剪零,它只是由toString方法不显示。 - Bozho
你的意思是在调试器中也使用toString吗?价格映射到BigDecimal。在我的代码中,当我在获取对象值列表的那个点上设置断点时,我看到映射值为58.2。此时还没有调用任何toString方法。我只是认为通过在@Column上添加精度注释,它会保持该值。 - haju
1
正如我所说,精度是关于最大值的。要设置您想要显示的方式,请使用十进制格式。 - Bozho
调试器使用toString来显示BigDecimals。 - Lluis Martinez

4
我可以告诉你,从数据库返回的BigDecimal值的创建是由专有JDBC驱动程序的ResultSet子类的getBigDecimal方法的实现完成的。
我通过使用调试器逐步查看Hibernate源代码来发现这一点,同时试图找到我的问题的答案
似乎getBigDecimal方法的某些实现将使用在数据库模式中定义的精度/比例,或者将尝试通过仅定义检索到的值所需的最小精度/比例来优化返回的BigDecimal。我猜Oracle驱动程序正在执行后者。
另请参见这个其他问题

-4
在业务逻辑类中,您也可以通过以下方式设置值: object_name.setPrice(new BigDecimal(50.20));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接