【问题标题】:Transformers.aliasToBean() argument type mismatchTransformers.aliasToBean() 参数类型不匹配
【发布时间】:2018-09-27 11:48:04
【问题描述】:

我有特定投影列表的休眠标准:

criteria.setProjection(Projections.projectionList()
            .add(Projections.property("contract.autoId"), "contractId")
            .add(Projections.property("customer.firstName"), "firstName")
            .add(Projections.property("contract.startDate"), "startDate")
            .add(Projections.property("contract.endDate"), "endDate"));

我想将此条件的响应映射到以下 DTO 对象:

public class Contract {
    private int contractId;
    private String description;
    private Date startDate;
    private Date endDate;
}

此标准的响应类型:

因此,第一个对象具有 Long 类型,但在 DTO contractId 中具有 int 类型。我无权更改此 dto 对象。 因此,当我将 ResultTransformer 添加到我的标准时:

criteria.setResultTransformer(Transformers.aliasToBean(Contract.class));

我遇到了以下异常:

java.lang.IllegalArgumentException: argument type mismatch

是否可以告诉Transformers.aliasToBean 自动将值从 Long 类型转换为 int 类型?

【问题讨论】:

标签: java hibernate criteria


【解决方案1】:

您可以使用addScalar 方法转换您的类型,该方法将负责将您的结果转换为预期的类型。 但是 afaik,它只能用Native Query 来完成。因此,您必须首先将投影转换为查询,然后添加标量:

yourSession
    .createSQLQuery("select autoId, firstName, startDate, endDate from ...")
    .addScalar("contractId") //or you can specify the type with .addScalar("contractId", Hibernate.TheTypeYouWant)

参考:https://docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/ch13.html

【讨论】:

  • 好的,这是一个解决方案。但我不是编写本机 sql 查询的忠实粉丝。而且我认为最好创建自定义 ResultTransformer 并手动进行正确的类型转换。我只是想,也许有一些方法可以自动完成。
  • 我也不是,但是如果是“一次性”查询,您可以更快地获得结果,然后创建自定义 ResultTransformer ,但我同意您的看法!许多可能的解决方案之一;)。很高兴它有帮助
猜你喜欢
  • 1970-01-01
  • 2016-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多