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) at org.hibernate.type.descriptor.sql.BigIntTypeDescriptor $ 1.doBind (BigIntTypeDescriptor.java:57) ...

,

난이 쿼리하려고하면

`@query (값 = "업데이트 할일 t 세트 t.done = (NOT t.done) t.id = 아이디")

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

[2014년 1월 20일 16시 28분 58초] 예기치 AST 노드 :하지 [업데이트 org.teamdev.todo.model.domain.ToDo t의 설정 t.done = (NOT

난 예외가 t.done) where t.id = : id]

HQL에서 inverse boolean을 사용하는 사람이 있습니까?

+0

시도 :'설정 t.done = (t.done == false)를' – acdcjunior

+0

나도 그것을 시도했다, 난'예외를했다 예기치 않은 토큰 ='거짓 거짓 – 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 콘솔에서 좋은 결과를 얻었습니다. 그러나 내 프로그램에서 실행될 때, 예외로 인해 추락했습니다 : '원인 : java.lang.IllegalArgumentException : org.hibernate.QueryParameterException : 선언 된 서수 매개 변수의 수를 초과하는 위치. 서수 매개 변수는 1 기반이라는 것을 기억하십시오! 위치 : org.hibernate.ejb.QueryImpl.setParameter (QueryImpl.java:451)에서 1 \t \t ...' 가 난'돈't 알고, 무엇을 문제지만, 설정을 제외하고 변형에서 어느 하나' t.done = (t.done = false)'작동하지 않습니다. – Aventes

관련 문제