如何使用JPA运行如下所示的查询。 (它适用于普通的SQL)
SELECT t
FROM table t
WHERE
(
CASE WHEN (( ... subquery ... ) IS NULL)
THEN (t.category IS NULL)
ELSE (t.viewId = :viewId)
END
)
我在MismatchedTokenException
IS
THEN (t.category IS NULL)
有可能吗?或者我需要重写这个查询吗?
答案 0 :(得分:10)
您可以将where子句转换为:
where
((... my first condition ...) and (something is NULL))
or
(not (... first condition ...) and (something2 = otherthing))
答案 1 :(得分:2)
我认为你做不到。阅读JPQL grammar(这里是OpenJPA的礼貌)。以下是定义案例表达式的术语,特别是您正在使用的一般案例表达式:
THEN
右侧的表达式必须是scalar_expression
。这就是说:
我没有根据所有这些术语的定义,但我认为它们不包括像(t.category IS NULL)
这样的东西,我担心。
答案 2 :(得分:1)
您可以从此处下载JPA 2.0规范最终版本: http://download.oracle.com/otndocs/jcp/persistence-2.0-fr-eval-oth-JSpec/
您应该在第6.5.7节中查看示例6 。
它显示了如何在Criteria API中使用case-when
。
我不确定,但如果您在t.category IS NULL
子句中使用它,我认为可以在THEN
块中使用逻辑表达式(WHERE
)。