我有带有特定投影列表的休眠条件:
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对象。 br />
因此,当我将 ResultTransformer 添加到我的条件中时:
criteria.setResultTransformer(Transformers.aliasToBean(Contract.class));
我遇到以下异常:
java.lang.IllegalArgumentException: argument type mismatch
是否可以对 Transformers.aliasToBean 说自动将值从Long类型转换为int?
答案 0 :(得分: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