使用JPA和Oracle在数据库中存储尾随零

时间:2013-08-10 18:06:13

标签: spring oracle java-ee jpa scale

我需要在我的数据库中存储价格。我正在使用JPA,所以我有一个这样的模型:

@Entity
@Table(name="products")
public class Product {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private long id;

    @Column(name="price")   
    private float price;
}

问题在于,当我用“4.20”这样的值填写价格表单输入时,在我的Oracle数据库中,我得到“4.2”,失去了尾随零。

我该如何解决这个问题?

编辑:由于我正在使用JPA,因此我必须避免在本机Oracle方言中编写查询。要存储产品(及其价格),我只需编写类似em.persist(product)的内容,其中em是EntityManager

1 个答案:

答案 0 :(得分:6)

你无法解决它,我建议这不是问题。这就是Oracle如何存储NUMBER值:所需的精度最低。如果您输入的价格为4.00,则会将其存储为4

请注意,在显示值时,Java不会默认为两位小数。您需要指定小数位数。

如果可能的话,我会使用BigDecimal代替float来代价。 float类型不准确。另一种方法是使用整数类型之一(intlong)并自己管理小数位。

要格式化Java代码中显示的价格,请使用String.format("%.2f", price)

要格式化Oracle查询中的价格,请使用TO_CHAR

SELECT TO_CHAR(price, '999999990.00'), etc.

选择最适合您的占位符数,并注意Oracle会在结果的开头添加额外的空格。如果数字是负数,则意味着保持减号,但对于零/正数,这是一个空格。要摆脱空间,请使用FM中的TO_CHAR修饰符:

SELECT TO_CHAR(price, 'FM999999990.00'), etc.