我是使用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
答案 0 :(得分:1)
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) = ''
因此,这种方法是特定于数据库实现的,并且可能会在某个时候改变。