搜索并發現了很多關于此的問題,但對于我的特殊情況卻沒有。我的 HQL 查詢出錯,代碼如下:
final Query query = session.createQuery(
" SELECT DISTINCT e "
" FROM Employee e"
" INNER JOIN Requisition r on r.supervisor = e.id "
" WHERE r.status = 'Open' "
" AND r.isEvergreen = false "
" AND r.isConfidential = false "
" AND r.employmentType != 'Intern (Fixed Term)' "
" AND ("
" CASE WHEN :searchString IS NOT NULL THEN (CONCAT(e.firstName, ' ', e.lastName) LIKE CONCAT('%', TRIM(:searchString), '%')) END)"
" ORDER BY e.firstName, e.lastName")
.setParameter("searchString", searchString);
這是錯誤日志:
org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected AST node: CASE near line 1, column 329 [ SELECT DISTINCT e FROM <Insert the rest of the query>
如果我在最后的 AND 和 setParameter 中洗掉 CASE WHEN 陳述句,則查詢有效。所以這意味著最后的 AND (...) 和/或新引入的引數有問題。
我是 Hibernate 的新手,并且正在為此苦苦掙扎,因為錯誤訊息不是很有幫助。有任何想法嗎?
uj5u.com熱心網友回復:
您擁有的案例不符合條件。您可以將案例簡化如下:
(coalesce(:searchString,1,0) =1 OR e.firstName||' '|| e.lastName LIKE '%'||:searchString||'%')
- 第一個合并將檢查 searchstring 是否為 null ,如果是則回傳 1 ,否則回傳 0 。
- 如果它回傳 1 ,則 OR 之后的運算式將不會被計算。
- 如果第一個運算式回傳 0 ,將計算 OR 之后的運算式
這將滿足您的用例,僅當它不為空時才應用 searchString 過濾器。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/487033.html
