EclipseLink 命名查询中的可选参数

Optional parameters in named query in EclipseLink

我是使用 EclipseLink 的 JPA 命名查询的新手,我想 "ignore" 命名查询中具有空值的属性。我知道我的问题已经回答了很多次。 例如JPA Query to handle NULL parameter value

但是,在我的例子中,以下格式不起作用

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

我遇到错误 'ILLEGAL USE OF KEYWORD NULL'。我现在将使用 CriteriaQuery 并且很好奇为什么它在命名查询中不起作用。 以下是正在使用的 DB2 和 Eclipselink 版本。 日蚀链接:2.5.1 DB2:DSN11015

JPA Specification

3.8.13 Named Queries
Named queries are static queries expressed in metadata. Named queries can be defined in the Java Persistence query language or in SQL. Query names are scoped to the persistence unit.

所以你不能真的指望它们会根据某些空条件在运行时发生变化。正如您所指出的,Criteria Query 本质上是动态的,因此是正确的选择。

根据评论编辑:

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

不在运行时更改查询(不跳过子句)。它将子句评估为 TRUE。 DB2(据我所知还有 Derby)的问题是,他们不允许 "non-typed Null to be sent to the backend" 按照 API PreparedStatement.setObject。您可以通过 casting

设置类型来测试它
 AND (ord.quoteNumber = cast(:dfdTxt as integer) or cast(:dfdTxt as integer) is null or cast(:dfdTxt as integer) = ''

所以这种方法是特定于数据库实现的,可能会在某些时候改变。