0

我是使用 EclipseLink 的 JPA 命名查询的新手,我想在命名查询中“忽略”具有空值的属性。我知道我的问题已被多次回答。例如JPA 查询来处理 NULL 参数值

但是,在我的情况下,以下格式不起作用

+ " AND (:quoteNumber IS NULL OR ord.quoteNumber = :quoteNumber)"

我收到错误“非法使用 NULL 关键字”。我现在将使用 CriteriaQuery,只是好奇为什么它在命名查询中不起作用。以下是正在使用的 DB2 和 Eclipselink 版本。eclipselink:2.5.1 DB2:DSN11015

4

1 回答 1

1

JPA规范

3.8.13 命名查询
命名查询是以元数据表示的静态查询。命名查询可以用 Java Persistence 查询语言或 SQL 定义。查询名称的范围是持久性单元。

所以你不能真的期望它们在运行时根据一些空条件而改变。正如您所指出的,标准查询本质上是动态的,因此是要走的路。

根据评论编辑:

 AND (ord.quoteNumber = :quoteNumber or :quoteNumber is null or :quoteNumber = '' 

不会在运行时更改查询(不跳过子句)。它将子句评估为 TRUE。DB2(据我所知还有 Derby)的问题是,它们不允许按照 API PreparedStatement.setObject将“非类型空值发送到后端”。您可以通过强制转换设置类型来测试它

 AND (ord.quoteNumber = cast(:dfdTxt as integer) or cast(:dfdTxt as integer) is null or cast(:dfdTxt as integer) = ''

因此,这种方法是特定于数据库实现的,并且可能会在某些时候发生变化。

于 2018-11-17T10:17:45.230 回答