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

时间:2018-11-11 23:02:02

标签: db2 eclipselink named-query db2-zos

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

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

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

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

1 个答案:

答案 0 :(得分:1)

JPA Specification

  

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

因此,您不能真正期望它们在运行时基于某些空条件而发生更改。正如您所指出的那样,条件查询本质上是动态的,因此也是可行的方法。

根据评论进行编辑:

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

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

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

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