2014-09-05 72 views
1

我有问题,当我实施“CASE WHEN”条件与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 

顺便说一句,。这里是它抛出异常:

产生的原因:java.lang.IllegalArgumentException异常: java.lang.ClassCastException : org.hibernate.hql.internal.ast.tree.ParameterNode can not be cast to org.hibernate.hql.internal.ast.tree.SelectExpression at org.springframework.data.jpa.repository.query.SimpleJpaQuery。( SimpleJpaQuery.java:73) at 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为null”应该是一个布尔表达式。也许“u.languageId =:userLanguageId”?或“u.languageId为NULL”? – 2014-09-05 08:13:37

回答

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)的类型:您将long与boolean进行比较,我不认为Hibernate会接受它。

而且,由于​​3210存在着对:

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

感谢您指出我的书面mistake..But我的观点是利用查询传递的变量与Then关键字..当我执行这个查询它抛出异常: 从用户选择ü ü 其中u.languageId = case when:userLanguageId is null then:managerLanguageId else:userLanguageId end – user3029929 2014-09-05 08:16:49

+0

然后,您应该检查java类型的'managerLanguageID'和'userLanguageId',它们必须与'u.languageId'匹配。并使用coalesce =>'coalesce(:userLanguageId,:managerLanguageID)'。 – NoDataFound 2014-09-05 08:29:52

+0

Thanku这么多的答复..我使用cocecece(:userLanguageId,:managerLanguageID)使用expecetd结果作出我的查询.. – user3029929 2014-09-05 08:40:12

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