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