【问题标题】:Custom type / converter in conjunction with Hibernate's Transformers.aliasToBean自定义类型/转换器结合 Hibernate 的 Transformers.aliasToBean
【发布时间】:2016-09-14 18:29:02
【问题描述】:

我正在 Hibernate 中执行本机查询,我想将结果集转换为 MyDto 的列表。

在使用原生查询时,我们通常遵循以下模式:

String query = "SELECT first_name as firstName, birth_date as birthDate ..."

def results = session.createSQLQuery(query)
    .setResultTransformer(Transformers.aliasToBean(MyDto.class))
    .list();

问题是我们在日期类中使用 Joda-time(在这种情况下,birthDate 是 LocalDate)。对于普通的 Hibernate 查询,这很好(我们有自己的简单用户类型)。但是对于本机查询,我们通常在 Dto 类中使用 java.util.Date 作为解决方法。我希望在我们的 Dtos 中保留 Joda 类型(LocalDate、Instant 等)以与我们的实体保持一致。

我在网上找到了这样一种解决方法:

// GrailsLocalDate is our custom UserType class for joda's LocalDate class
Type localDateType = new TypeLocatorImpl(
    new TypeResolver()).custom(GrailsLocalDate.class);

def results =  session.createSQLQuery(query)
    .addScalar("birthDate", localDateType)
    .setResultTransformer(Transformers.aliasToBean(CorrespondentAssociateDto.class))
    .list()

问题是,一旦我调用 addScalar,它似乎改变了我必须使用 addScalar 调用指定所有列的行为。因此,如果我的查询选择 10-15 列,我需要添加 10-15 个 addScalar 调用。而如果我没有任何自定义转换,我就不需要任何 addScalar 调用,而 aliasToBean 只是基于将结果集别名与 DTO 的字段名称匹配进行映射。我希望我可以只为给定的列指定一个转换器,然后 aliasToBean 会像往常一样将其余的。

有没有人做过类似的事情?

【问题讨论】:

    标签: java hibernate grails


    【解决方案1】:

    我找到了一个更简单的解决方法,我可以像这样简单地将设置器添加到我的 Dto 中:

    public void setBirthDate(java.util.Date d) {
        if (d == null) {
            this.birthDate = null;
        } else {
            this.birthDate = new LocalDate(d.getTime());
        }
    }
    

    ...当然,您可以将其包装到一个实用程序方法中。


    编辑:这导致我们正在执行的代码中的其他地方出现问题:

    myDto.birthDate = someLocalDate // implicitly calls setBirthDate(java.util.Date).
    

    解决方法是更改​​我的 setter 名称:

    public void setCustomSetterForBirthDate(...
    

    在我的查询中,我将birth_date 列别名为customSetterForBirthDate:

    String query = "SELECT ..., birth_date as customSetterForBirthDate ..."
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-04
      • 1970-01-01
      相关资源
      最近更新 更多