我是使用EclipseLink的JPA命名查询的新手,我想"忽略"命名查询中具有null值的属性。我知道我的问题已经被回答过很多次了。例如处理NULL参数值的JPA查询
然而,在我的情况下,以下格式不起作用
+ " AND (:quoteNumber IS NULL OR ord.quoteNumber = :quoteNumber)"
我收到错误"非法使用NULL关键字"。我现在将使用CriteriaQuery,只是想知道为什么它在命名查询中不起作用。以下是正在使用的DB2和Eclipselink版本。eclipse链接:2.5.1DB2:dsn1015atr
JPA规范规定
3.8.13命名查询
命名查询是用元数据表示的静态查询。命名查询可以在Java持久性查询语言或SQL中定义。查询名称的作用域是持久性单元。
所以你不能真的期望它们在运行时基于一些null条件进行更改。正如您所指出的,CriteriaQuery本质上是动态的,所以这将是一种可行的方法。
根据注释编辑:
AND (ord.quoteNumber = :quoteNumber or :quoteNumber is null or :quoteNumber = ''
不会在运行时更改查询(不会跳过子句(。它将子句求值为TRUE。DB2(据我所知,还有Derby(的问题是,它们不允许根据API PreparedStatement.setObject将"non-typed Null发送到后端">
AND (ord.quoteNumber = cast(:dfdTxt as integer) or cast(:dfdTxt as integer) is null or cast(:dfdTxt as integer) = ''
因此,这种方法是特定于DB实现的,可能会在某个时候发生变化。