是否可以在JPA中传递并测试空列表?

Lai*_*son 5 jpa jpa-2.0

我有一个JPQL命名查询,它接受List一个参数.我正在使用IN短语中的参数:

...WHERE x.id IN :list
Run Code Online (Sandbox Code Playgroud)

我想做类似以下的事情,但语法显然不会让我:

...WHERE :list IS EMPTY OR x.id IN :list
Run Code Online (Sandbox Code Playgroud)

也不会:

...WHERE SIZE(:list) = 0 OR x.id IN :list
Run Code Online (Sandbox Code Playgroud)

我在JPA 2.0命名查询中尝试做什么是不可能的?我知道如何通过条件API或使用普通的旧JPQL字符串来完成它.

ben*_*n75 -4

您在查询中尝试执行的操作似乎毫无意义。您试图使用参数的状态来限制查询结果。但您不会将此参数与您选择的任何参数进行比较。

考虑一下这个查询(没有意义):

SELECT * FROM SOMETABLE WHERE :list IS EMPTY
Run Code Online (Sandbox Code Playgroud)

所以我认为您需要在两个不同的查询之间进行选择之前检查 :list 是否为空:

如果:list不为空:...WHERE x.id IN :list

如果:list为空:(NO WHERE CLAUSE AT ALL)

  • 我将在我无力的辩护中提出,在生成的场景中经常会看到以下类型的 SQL(不是 JPQL):“SELECT x FROM y WHERE 1 = 1;”(即,无论何时组装“WHERE”子句,有时都会确保“ 1 = 1` 位于 `WHERE` 子句中,因此动态汇编不必执行您正在讨论的那种 if/then 逻辑)。话虽如此,我认为在 JPQL 中我无法摆脱这个问题。谢谢。 (4认同)