Db2 EclipseLink中命名查询中的可选参数

Db2 EclipseLink中命名查询中的可选参数,db2,eclipselink,named-query,db2-zos,Db2,Eclipselink,Named Query,Db2 Zos,我不熟悉使用EclipseLink的JPA命名查询,我想在命名查询中“忽略”具有空值的属性。我知道我的问题已经被回答了很多次。 e、 g 但是,在我的情况下,以下格式不起作用 + " AND (:quoteNumber IS NULL OR ord.quoteNumber = :quoteNumber)" 我收到错误“非法使用关键字NULL”。我现在将使用CriteriaQuery,只是想知道为什么它在命名查询中不起作用。 下面是正在使用的DB2和Eclipselink版本。 日食:2.5.1

我不熟悉使用EclipseLink的JPA命名查询,我想在命名查询中“忽略”具有空值的属性。我知道我的问题已经被回答了很多次。 e、 g

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

+ " AND (:quoteNumber IS NULL OR ord.quoteNumber = :quoteNumber)"
我收到错误“非法使用关键字NULL”。我现在将使用CriteriaQuery,只是想知道为什么它在命名查询中不起作用。 下面是正在使用的DB2和Eclipselink版本。 日食:2.5.1 DB2:DSN11015

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

因此,您不能期望它们在运行时根据一些空条件进行更改。正如您所指出的,条件查询本质上是动态的,所以应该这样做

根据评论进行编辑:

 AND (ord.quoteNumber = :quoteNumber or :quoteNumber is null or :quoteNumber = '' 
不在运行时更改查询(不跳过该子句)。它将该子句评估为TRUE。DB2(以及据我所知的Derby)的问题是,它们不允许按照API“将非类型化Null发送到后端”。您可以通过设置类型来测试它

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

因此,这种方法是特定于DB实现的,可能会在某个时候发生变化。

这是您的实际代码吗?双引号和/或右括号似乎放错了位置。这是打字错误。感谢这看起来像是一个DB异常-生成的SQL是什么?您必须检查您的数据库文档,看看是否支持“column=null”,或者它是否是它不喜欢的“null is null”。这是我的命名查询:从o的顺序中选择o,其中(o.quoteNumber=:quoteNumber)或(:quoteNumber is null)),这是生成一个:从o的顺序中选择*,其中(o.quoteNumber=null)或(null为null))您是否希望对命名查询进行某种动态调整(null参数不是where子句的一部分)?谢谢您的回答。你的意思是提供的答案是错误的吗?不客气,我已经根据你的评论更新了我的答案。