在查询映射期间为 Hibernate 中的列设置默认值
Setting default values for columns in Hibernate during query mapping
@Column (name="AMOUNT")
private BigDecimal amount;
我在 Whosebug 上看到了很多答案,解决方案是使用 columnDefinition
或在 Java 构造函数中设置默认值。
但我需要的是数据查询,而不是table创建或数据插入。当我使用hibernate session查询出对象,调用方法getAmount()
时,会得到return null BigDecimal
对象,我想设置默认值为0 BigDecimal
.
映射是由 Hibernate 框架完成的,我该怎么做?
您有多种选择:
- 使用
@Transient
getter 方法。在这种情况下,您可能希望将 amount 字段的 getter 标记为受保护或私有(Hibernate 不会关心),然后公开一个用 @Transient
注释的特殊 public 方法为您执行翻译。
- 使用
@PostLoad
注释方法事件回调来转换值而不是 @Convert
。您可能想利用 #1 的一部分,在其中添加一个新的 属性 来存储您在 post 加载回调中计算的翻译值,然后使用 getter 注释字段或 @Transient
.
- 如果可以利用 JPA 2.1,请使用属性转换器。在这种情况下,您将使用
@Convert
注释该字段并指定一个转换器 class 实现,将空值转换为 0
。
前两个选项的好处是您无需关心如何将值映射回数据库列(例如 0
是否转换为 NULL
table 级)。
从性能的角度来看,如果 amount
被多次访问,我可能会个人使用 #2 并在翻译一次后缓存该值。
@Column (name="AMOUNT")
private BigDecimal amount;
我在 Whosebug 上看到了很多答案,解决方案是使用 columnDefinition
或在 Java 构造函数中设置默认值。
但我需要的是数据查询,而不是table创建或数据插入。当我使用hibernate session查询出对象,调用方法getAmount()
时,会得到return null BigDecimal
对象,我想设置默认值为0 BigDecimal
.
映射是由 Hibernate 框架完成的,我该怎么做?
您有多种选择:
- 使用
@Transient
getter 方法。在这种情况下,您可能希望将 amount 字段的 getter 标记为受保护或私有(Hibernate 不会关心),然后公开一个用@Transient
注释的特殊 public 方法为您执行翻译。 - 使用
@PostLoad
注释方法事件回调来转换值而不是@Convert
。您可能想利用 #1 的一部分,在其中添加一个新的 属性 来存储您在 post 加载回调中计算的翻译值,然后使用 getter 注释字段或@Transient
. - 如果可以利用 JPA 2.1,请使用属性转换器。在这种情况下,您将使用
@Convert
注释该字段并指定一个转换器 class 实现,将空值转换为0
。
前两个选项的好处是您无需关心如何将值映射回数据库列(例如 0
是否转换为 NULL
table 级)。
从性能的角度来看,如果 amount
被多次访问,我可能会个人使用 #2 并在翻译一次后缓存该值。