讓我們來看看爲什麼你會得到這個例外。
從這個問題很明顯,你已經在你的模型類中使用@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