【问题标题】:Storing trailing zeroes in database with JPA and Oracle使用 JPA 和 Oracle 在数据库中存储尾随零
【发布时间】:2013-08-12 11:00:19
【问题描述】:

我需要在我的数据库中存储价格。我正在使用 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

【问题讨论】:

  • 您希望将价格存储为 float/double - 这通常不是一个好主意。我建议切换到整数,并使用(可能是隐含的)货币+货币指数。 4.20 -> 420 (USD,2)

标签: spring oracle jakarta-ee jpa scale


【解决方案1】:

你无法解决它,我建议这不是问题。这就是 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 会在结果的开头放置一个额外的空格。如果数字为负数,它意味着持有一个减号,但对于零/正数,它是一个空格。要摆脱空间,请使用TO_CHAR 中的FM 修饰符:

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

【讨论】:

  • 好的,我会尝试使用 BigDecimal。但我不明白应该在我的代码中哪里写String.format("%.2f", price)。另一个问题是,由于我使用的是 JPA,因此我避免使用本地 Oracle 方言编写查询。要存储产品(及其价格),我只需编写类似 em.persist(product) 的内容,其中 em 是 EntityManager。
  • +1 但它与 Oracle 存储格式无关,仅与输出表示有关。
  • Kurt - 我不熟悉 JPA(我主要使用 .NET MVC),但是通过一些谷歌搜索,我拼凑了这个可以为您的 price 值工作的注释。第 1 行:@Column(name="price", precision=12, scale=2)。第 2 行:private BigDecimal price;。如果它像我希望的那样工作,你可能不需要做String.format 的事情。据我所知,注释也可能适用于float。希望这会有所帮助:)
  • @EdGibbs 我尝试了这个解决方案,但我一直在数据库上得到一个“4.2”的值。这可能是一个不错的解决方案...
  • @KurtBourbaki - 无论您做什么,Oracle 都会将其存储为“4.2”。没有办法绕过它。重要的是在您的表单上将值显示为 4.20,而无需进行各种特殊编程,并且希望 JPA 注释的某种组合可以实现这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-26
  • 1970-01-01
  • 1970-01-01
  • 2020-04-01
  • 2019-12-22
  • 1970-01-01
相关资源
最近更新 更多