【问题标题】:Optional parameters in named query in EclipseLinkEclipseLink 中命名查询中的可选参数
【发布时间】:2019-04-14 16:46:29
【问题描述】:

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

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

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

我收到错误“非法使用 NULL 关键字”。我现在将使用 CriteriaQuery,只是好奇为什么它在命名查询中不起作用。 以下是正在使用的 DB2 和 Eclipselink 版本。 日食链接:2.5.1 DB2:DSN11015

【问题讨论】:

  • 这是您的实际代码吗?双引号和/或右括号似乎放错了位置。
  • 那是错字。谢谢
  • 这看起来像一个 DB 异常 - 生成的 SQL 是什么?您必须检查您的数据库文档以查看是否支持“column = null”,或者它是否不支持“null is null”。
  • 这是我的命名查询:SELECT o FROM ORDER o WHERE (o.quoteNumber = :quoteNumber) OR (:quoteNumber IS NULL)) 这是生成一个:SELECT * FROM ORDER o WHERE (o .quoteNumber = NULL) OR (NULL IS NULL))
  • 您是否期望对命名查询进行某种动态调整(空参数不属于 where 子句)?

标签: db2 eclipselink named-query db2-zos


【解决方案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。您可以通过强制转换设置类型来测试它

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

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

【讨论】:

  • 感谢您的回答。您的意思是here 提供的答案是错误的吗?
  • 欢迎您,我已根据您的评论更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 2011-01-27
  • 2013-10-22
  • 2010-10-27
  • 2010-12-09
  • 2015-08-27
  • 1970-01-01
  • 2015-09-14
  • 1970-01-01
相关资源
最近更新 更多