java - JPA 将 BigDecimal 作为整数保存在数据库中

标签 java jpa spring-data-jpa

我在数据库中有这个字段:

ITEMCOST    NUMERIC (13)    DEFAULT 0  NOT NULL

在JAVA中,Entity中的字段定义如下:

@Column(name = "ITEMCOST")
private BigDecimal itemCost;

这些值作为整数存储在数据库中。其中最后两位数字是十进制值。像这样:

  • DB 100 表示 1.00
  • DB 250 表示 2.50
  • 等等

我想要的是当我读取实体时,值会像这样加载。 如果数据库中的值为 357,则 BigDecimal 的值应为“3.57”。当我保存该实体时,该值应再次转换为 INT。

最佳答案

正如评论所说,您应该使用属性转换器。

请在此处查找说明 https://www.thoughts-on-java.org/jpa-21-how-to-implement-type-converter/

它可能看起来像这样:

@Converter
public class BigDecimalConverter implements AttributeConverter<BigDecimal, Long> {

  @Override
  public Long convertToDatabaseColumn(BigDecimal value) {
    if (value == null) {
        return null;
    } else {
        return value.multiply(BigDecimal.valueOf(100)).longValue();
    }
  }

  @Override
  public BigDecimal convertToEntityAttribute(Long value) {
    if (value == null) {
        return null;
    } else {
        return new BigDecimal(value).divide(BigDecimal.valueOf(100));
    }
  }
}

然后您可以在您的实体中使用它

@Convert(converter = BigDecimalConverter.class)
@Column(name = "ITEMCOST")
private BigDecimal itemCost;

关于java - JPA 将 BigDecimal 作为整数保存在数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47703481/

相关文章:

java - 如何使 Horizo​​ntalScrollView 从右到左滚动 android

java - 使用 python 或 java 将不可见文本添加到 pdf 以制作可搜索的 pdf

postgresql - JPA:如何从其他表中删除用户和所有引用?

java - 为什么将 @Repository 放在 Spring Data JPA 接口(interface)之上?

postgresql - Spring JPA : Update entity with updated child entities

java - 带有 c3p0 的 spring JPA 在第一次请求时连接超时

Java DefaultSslContextFactory keystore 动态更新

java - ListView 适配器行为异常。在我单击同一个 ListView 中的按钮后,ListView 中不相关的按钮被单击

java - 设置自动冲洗 Spring JPA

java - Spring-Boot @TestPropertySource 与@SpringBootTest 一起使用时不加载外部属性文件