【发布时间】: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 会像往常一样将其余的。
有没有人做过类似的事情?
【问题讨论】: