在WHERE子句中使用CASE WHEN进行JPA查询。怎么做?

时间:2012-03-12 19:14:29

标签: java jpa eclipselink

如何使用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)

有可能吗?或者我需要重写这个查询吗?

3 个答案:

答案 0 :(得分:10)

您可以将where子句转换为:

where
    ((... my first condition ...) and (something is NULL))
    or
    (not (... first condition ...) and (something2 = otherthing))

答案 1 :(得分:2)

我认为你做不到。阅读JPQL grammar(这里是OpenJPA的礼貌)。以下是定义案例表达式的术语,特别是您正在使用的一般案例表达式:

  • case_expression :: = general_case_expression | simple_case_expression | coalesce_expression | nullif_expression
  • general_case_expression :: = CASE when_clause {when_clause} * ELSE scalar_expression END
  • when_clause :: = WHEN conditional_expression THEN scalar_expression

THEN右侧的表达式必须是scalar_expression。这就是说:

  • scalar_expression :: = arithmetic_expression | string_primary | enum_primary | datetime_primary | boolean_primary | case_expression | entity_type_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)。