2014-09-05 71 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