2014-01-20 3 views
1

Я новичок в Hibernate.Hibernate HQL casting java.lang.ClassCastException: java.lang.Integer нельзя отнести к java.lang.Long

При попытке обратного булево

@Query(value = "update ToDo t set t.done= (abs(t.done -1)) where t.id=:id") public void toogleDone(@Param("id") long id);

я есть это исключение:

[2014-01-20 16:20:38] java.lang.ClassCastException: 

java.lang.Integer не может быть приведен к java.lang.Long в орг. hibernate.type.descriptor.java.LongTypeDescriptor.unwrap (LongTypeDescriptor.java:36) в org.hibernate.type.descriptor.sql.BigIntTypeDescriptor $ 1.doBind (BigIntTypeDescriptor.java:57) ...

когда я попробовать этот запрос:

`@Query (значение = "обновление ToDo т множество t.done = (НЕ t.done), где t.id =: идентификатор")

public void toogleDone(@Param("id") long id);` 

я есть исключение:

[2014-01-20 16:28:58] неожиданный AST узел: не [обновление org.teamdev.todo.model.domain.ToDo т множество t.done = (NOT t.done), где t.id =: id]

Есть ли у вас какие-либо идеи, чтобы инвертировать boolean в HQL?

+0

Try: 'установить t.done = (t.done == ложь)' – acdcjunior

+0

я попробовал это тоже я имел исключение ' неожиданный токен = 'near false – Aventes

+0

Как насчет одного' = 'в одиночку? 'set t.done = (t.done = false)'? Или 'set t.done = (t.done <1)' или 'set t.done = ((t.done + 0) <1)'? – acdcjunior

ответ

0

Использование set t.done = (t.done=false), поэтому запрос будет:

update ToDo t set t.done = (t.done=false) where t.id=:id 
0

Вы просто хотите переключить значение бита? Вы можете выполнить это с помощью CASE.

update ToDo t set t.done = (case when t.done = 1 then 0 else 1 end) where t.id=:id 
+0

Да, я попробовал. И у меня в консоли JPA хороший результат. Но когда он запускается в моей программе, он разбился с ошибкой: 'Caused by: java.lang.IllegalArgumentException: org.hibernate.QueryParameterException: позиция за пределами числа объявленных порядковых параметров. Помните, что порядковые параметры основаны на 1! Позиция: 1 \t на org.hibernate.ejb.QueryImpl.setParameter (QueryImpl.java:451) \t ... ' I'm не знаю, в чем дело, но ни один из вариантов, за исключением' набор t.done = (t.done = false) 'не работает. – Aventes

Смежные вопросы