Java 在查询映射期间为Hibernate中的列设置默认值

Java 在查询映射期间为Hibernate中的列设置默认值,java,hibernate,automapper,hibernate-mapping,Java,Hibernate,Automapper,Hibernate Mapping,我在Stackoverflow中看到了许多答案,解决方案是使用columnDefinition或在Java构造函数中设置默认值 但我需要的是数据查询,而不是表创建或数据插入。当我使用hibernate会话查询出对象,并调用方法getAmount(),它将返回nullBigDecimal对象,我希望将该对象的默认值设置为0BigDecimal 既然映射是由Hibernate框架完成的,我该怎么做呢?您有几个选项: 使用@Transientgetter方法。在这种情况下,您可能希望将amount字段

我在Stackoverflow中看到了许多答案,解决方案是使用
columnDefinition
或在Java构造函数中设置默认值

但我需要的是数据查询,而不是表创建或数据插入。当我使用hibernate会话查询出对象,并调用方法
getAmount()
,它将返回null
BigDecimal
对象,我希望将该对象的默认值设置为0
BigDecimal


既然映射是由Hibernate框架完成的,我该怎么做呢?

您有几个选项:

  • 使用
    @Transient
    getter方法。在这种情况下,您可能希望将amount字段的getter标记为protected或private(Hibernate不会在意),然后公开一个特殊的公共方法,该方法用
    @Transient
    注释,为您执行翻译
  • 使用
    @PostLoad
    带注释的方法事件回调来转换值,而不是使用
    @Convert
    。您可能希望利用#1的一部分,在其中添加一个新属性,该属性存储加载后回调中计算的转换值,然后使用
    @Transient
    注释字段或getter
  • 如果可以利用JPA2.1,请使用属性转换器。在本例中,您将使用
    @Convert
    注释该字段,并指定一个将空值转换为
    0
    的转换器类实现 前两个选项的好处是,您不需要关心如何将值映射回数据库列(例如,
    0
    是否在表级别转换为
    NULL


    从性能角度来看,如果多次访问
    amount
    ,我可能会亲自使用#2并在转换一次后缓存该值

    您有几种选择:

  • 使用
    @Transient
    getter方法。在这种情况下,您可能希望将amount字段的getter标记为protected或private(Hibernate不会在意),然后公开一个特殊的公共方法,该方法用
    @Transient
    注释,为您执行翻译
  • 使用
    @PostLoad
    带注释的方法事件回调来转换值,而不是使用
    @Convert
    。您可能希望利用#1的一部分,在其中添加一个新属性,该属性存储加载后回调中计算的转换值,然后使用
    @Transient
    注释字段或getter
  • 如果可以利用JPA2.1,请使用属性转换器。在本例中,您将使用
    @Convert
    注释该字段,并指定一个将空值转换为
    0
    的转换器类实现 前两个选项的好处是,您不需要关心如何将值映射回数据库列(例如,
    0
    是否在表级别转换为
    NULL

    从性能角度来看,如果多次访问
    amount
    ,我可能会亲自使用#2并在转换一次后缓存该值

    @Column (name="AMOUNT")
    private BigDecimal amount;