当前位置: 首页 > 知识库问答 >
问题:

在JPQL中处理空参数

汪博艺
2023-03-14

我刚刚意识到,当任何参数为null时,JPQL where子句都不能像我预期的那样工作。例如,这个简单的JPQL查询

SELECT en FROM Entity en WHERE en.name = :name

name参数为null时不返回任何结果,即使数据库中存在名称设置为null的实体。

在这种情况下,Hibernate使用WHERE实体执行SQL。名称=空。显然,这不是由数据库处理的,因为对于空比较,标准定义为NULL(请参见SQL is NULL and=NULL)。JPQL还有一个为NULL的操作符(http://docs.oracle.com/javaee/6/tutorial/doc/bnbuf.html#bnbvi)其行为与SQL中的行为完全相同(http://docs.oracle.com/javaee/6/tutorial/doc/bnbuf.html#bnbvr)。

我认为这是一个常见的情况,但快速搜索并没有给我任何有趣的结果。

那么,有没有办法在查询中包含null值?到目前为止,我得出了以下结论:

SELECT en FROM Entity en WHERE (:name IS NULL AND en.name IS NULL) OR en.name = :name

它工作得很好,但看起来并不优雅,尤其是在较大的查询中。

还有一个问题:为什么JPQL会模仿SQL的这个奇怪的方面?


共有1个答案

瞿博易
2023-03-14
匿名用户

并非所有JPA实现都会转换为en。name=:name,参数为null到实体。名称=空。例如,我使用的实现(DataNucleus JPA)将其转换为实体。名称为空。

JPQL不告诉实现SQL执行什么,只告诉用户可以定义什么。其余的由实现来决定。由用户决定使用哪个实现。

 类似资料:
  • 问题内容: 我正在使用JPA,hibernate3。 当没有空值或空值时,此查询就像一个超级按钮。但是 traceEntityVO.getLotNumber(),traceEntityVO.getMfrLocId(),traceEntityVO.getExpDate()的 值可能为null或为空 。 在这种情况下,将针对变量而不是 null 条件来检查值’null’或’‘ 。当我不确定参数值是否为

  • 问题内容: 我正在为CodeIgniter开发我的REST客户端库,并且正在努力研究如何在PHP中发送PUT和DELETE参数。 在一些地方,我看到人们在使用这些选项: 令人讨厌的是,这似乎无济于事。这是设置PUT参数的正确方法吗? 如果是这样,如何设置DELETE参数? $ this- > option()是我的库的一部分,它只是建立一个CURLOPT_XX常量数组,并在执行建立的cURL请求时

  • 我建立了一个数据库连接。然后,我尝试建立连接,如果出现异常,则返回。在代码的下面,我有一个Finally块,我打算用它作为一个catch all来关闭连接。 然而,如果初始连接失败,它将跳转到我的con所在的最后一个块。close()引发空指针异常。最好的办法是什么?有没有办法测试con是否为null?我试过if(con.isValid(0))和con。等于(null)和con==null,它们都

  • 当有空格,尤其是javaagent参数时,通过将参数传递给我的命令会遇到一些问题。我也遵循了这个建议,在分号后面加上了双引号,但运气不好。 我使用的命令是: 不幸的是,这似乎不起作用。如果有帮助的话,我在OSX上使用bash。 知道我错过了什么吗?

  • 当作为参数传递时,为什么调用具有类型为的参数的方法,而不是调用具有类型为的参数的方法?

  • 问题内容: 我有一个带有参数的存储过程,我想在子句中使用该参数来匹配列的值,即类似 现在,由于工作方式的原因,这当然不符合要求。我需要做吗 在这种情况下还是有一种更简洁的方法? 问题答案: 您可以通过以下方式使用功能: 从SQL参考中引用: 在DECODE函数中,Oracle认为两个空值是等效的。