让我们来看看为什么你会得到这个例外。
从这个问题很明显,你已经在你的模型类中使用@Enumerated(EnumType.STRING)
注释字段'b'。所以该字段是枚举为您的模型类和varchar为您的数据库。原生SQL不关心你的模型类,并返回数据库表中原来的状态。因此,在您的情况下,您正在使用的SQLQuery
将返回String
代替'b'而不是ProfileStateEnum
类型。但是'b'在Profile
类中的设置方法需要ProfileStateEnum
类型参数。
因此,你得到的异常“预期的类型:Foo.ProfileStateEnum,实际值:java.lang.Character中的”
您可以使用别名来解决这个问题。
我的建议是,用你想要的任何名称为你的列别名,并为你的模型/ dto中的别名创建一个setter方法。
例如,可以将您的列别名为'enumStr'。
然后将查询看起来是这样的: “选择A,B为enumStr从型材”
现在,创建在您Profile
类的别名setter方法。
(假设枚举ProfileStateEnum
可以具有任何两个值STATE1
和STATE2
的)
public void setEnumStr(String str){
/*Convert the string to enum and set the field 'b'*/
if(str.equals(ProfileStateEnum.STATE1.toString())){
b = ProfileStateEnum.STATE1;
} else {
b = ProfileStateEnum.STATE2;
}
}
现在上变换时,装定为别名setEnumStr(String)
将被调用,而不是设置器为字段setB(ProfileStateEnum)
和字符串将被转换并保存为您想要的类型,无任何例外。
我是Hibernate的初学者,解决方案适用于我。我正在使用PostgreSQL。但我相信它也适用于其他数据库。
来源
2016-11-14 05:38:57
AJA
你只想使用** Transformers.aliasToBean **或** HQL **会做什么? – ManuPK 2012-03-09 13:27:19
我正在编写本机SQL查询,因此我猜测HQL不够。 – 2012-03-10 05:11:16