2014-09-05 3 views
1

я с проблемой, когда я реализую «случай, когда» условие с JPQLслучай, когда выражение в JPQL

<dependency> 
     <groupId>org.hibernate.javax.persistence</groupId> 
     <artifactId>hibernate-jpa-2.0-api</artifactId> 
</dependency> 


select u 
    from user u 
    where u.languageId = case 
    when :userLanguageId is null then :managerLanguageID 
    else :userLanguageId 
    end 

Я хочу, чтобы получить данные, основанные на managerLanguageID, если данные, соответствующие userLanguageId равно нулю. Поэтому проблема возникает, когда я использую параметр с ключевым словом THEN. но он отлично работает, если я установить параметр вручную, как:

select u 
    from user u 
    where u.languageId = case 
    when :userLanguageId is null then 1 
    else :userLanguageId 
    end 

BTV, .Здесь исключение он бросает:

Вызванный: java.lang.IllegalArgumentException: java.lang.ClassCastException : org.hibernate.hql.internal.ast.tree.ParameterNode не может быть отнесен к org.hibernate.hql.internal.ast.tree.SelectExpression в org.springframework.data.jpa.repository.query.SimpleJpaQuery. (SimpleJpaQuery.java:73) по адресу org.springframework.data.j pa.repository.query.SimpleJpaQuery.fromQueryAnnotation (SimpleJpaQuery.java:132) на org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy $ DeclaredQueryLookupStrategy.resolveQuery (JpaQueryLookupStrategy.java:114)

+0

Таким образом, «u.languageId =: userLanguageId is null» должно быть логическим выражением. Возможно, «u.languageId =: userLanguageId»? или "u.languageId NULL"? –

ответ

1

Ваш запрос кажется неправильным для меня:

select u 
from user u 
where u.language_id = case 
    when (u.languageId = :userLanguageId is null) then 1 
    else :userLanguageId 
end 

Оно должно быть:

select u 
from user u 
where u.languageId = case 
    when :userLanguageId is null then 1 
    else :userLanguageId 
end 

Потому что:

(1) u.languageId = :userLanguageId is null 
(2) u.languageId = (:userLanguageId is null) 
(3) <long> = <boolean> 

Выражение (1) эквивалентно (2), а тип (2) - тип (3): вы сравниваете длину с булевым, и я не думаю, что Hibernate это примет.

И, так как coalesce существует для этого:

select u 
from user u 
where u.language_id = coalesce(:userLanguageId, 1) 
+0

спасибо за указание моего письменного mistake..But моей точки зрения, чтобы сделать использование переменного передаются в запросе с ТОГДА ключевым словом .. когда я выполнить этот запрос он бросает исключение: выбрать U от пользователя у где u.languageId = case when: userLanguageId is null then: managerLanguageId else: userLanguageId end – user3029929

+0

Тогда вы должны проверить тип java 'managerLanguageID' и' userLanguageId', который должен соответствовать параметрам 'u.languageId'. И используйте coalesce => 'coalesce (: userLanguageId,: managerLanguageID)'. – NoDataFound

+0

Спасибо большое за ответ. Я сделал свой запрос с результатом expecetd с использованием coalesce (: userLanguageId,: managerLanguageID). – user3029929

1

Я получил это .. Я получил класс произнесения исключение solution.The, что произошло из-за CaseNode.getDataType требует SelectExpression. Таким образом, мы должны явно привести динамический параметр (в целое число или строку, независимо от типа данных нам нужно), что мы посылаем в нашем запросе, ........ CAST. (: ManagerLanguageID как целое)

select u 
    from user u 
    where u.languageId = case 
    when :userLanguageId is null then CAST (:managerLanguageID as integer) 
    else :userLanguageId 
    end 
Смежные вопросы