Давайте посмотрим, почему вы получаете это исключение.
Из вопроса очевидно, что вы использовали @Enumerated(EnumType.STRING)
аннотацию для поля 'b' у тебя модельный класс.Таким образом, поле представляет собой перечисление для вашей модели класса и varchar для вашей базы данных .Собственный SQL не заботится о вашем классе модели и возвращает то, что есть в таблице базы данных, как есть.Таким образом, в вашем случае SQLQuery
, который вы используете, вернет String
для 'b' вместо типа ProfileStateEnum
.Но ваш метод установки для 'b' в классе Profile
принимает аргумент типа ProfileStateEnum
.
Таким образом, вы получите исключение "ожидаемый тип: Foo.ProfileStateEnum, фактическое значение: java.lang.Character"
Вы можете использовать Aliasing для решенияпроблема.
Я предлагаю создать псевдоним вашего столбца с любым именем и создать метод установки для этого псевдонима в вашей модели / dto.
Например, пусть псевдоним вашего столбца будет 'enumStr'.
Тогда ваш запрос будет выглядеть так: " выберите a, b в качестве enumStr из профилей "
Теперь создайте метод установки для этого псевдонима в вашем классе Profile
.
(Предполагая, что перечисление 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.Но я считаю, что это работает и для других баз данных.