如何在 HQL 中模拟 NVL

Posted

技术标签:

【中文标题】如何在 HQL 中模拟 NVL【英文标题】:How to simulate NVL in HQL 【发布时间】:2010-10-10 17:44:04 【问题描述】:

我试过这个:

from Table where (:par1 is null or col1 = :par1)

但是碰巧

from Table where :par1 is null

总是返回表的所有行,即使 :par1 不为空。

同时

 select * from table where col1 = 'asdf'

不返回任何行。

我不能使用本机语法,因为我的应用程序应该在不同的数据库引擎上运行

【问题讨论】:

【参考方案1】:

HQL 中与nvl 命令等效的是coalesce 命令。如果a 不为null,coalesce(a,b) 将返回a,否则b

所以你会想要以下内容:

from Table where col1 = coalesce(:par1, 'asdf')

【讨论】:

我实际上想要的是: from Table where col1 = coalesce(:par1, col1) 并且它起作用了!非常感谢! coalesce() 也是一个 ANSI SQL 函数,应该适用于大多数数据库,例如甲骨文,本机。 同样在 jpa 实体命名查询中,它不能与 nvl 一起使用,但可以与 coalesce 一起使用【参考方案2】:

如果你的底层数据库是Oracle,那么你可以使用nvl函数,我试过了,它对我有用。

Query query = session.createQuery(
                    " select ft from FeatureToggle ft left outer join ft.featureToggleCustomerMap "
                    + " ftcm where nvl(ftcm.custId,:custId) = :custId");

query.setParameter("custId", Long.valueOf(custId));

您的用例可能不同,如果数据库是 nvl,您可以根据您的要求使用 nvl 函数,不确定其他数据库的执行情况,因为我仅将此代码用于 Oracle。 希望对您有所帮助。

【讨论】:

OP 提到该应用程序必须在不同的数据库上运行。在这种情况下,这不是预期的答案。

以上是关于如何在 HQL 中模拟 NVL的主要内容,如果未能解决你的问题,请参考以下文章

如何在spring数据仓库nativeQuery中使用oracle NVL函数

HQL 调用封闭函数时没有节点异常的数据类型

如何在本机查询中使用 NVL 或 COALESCE 获取 Spring Data JPA 中的值列表

Presto 检查是不是为 NULL 并返回默认值(NVL 模拟)

如何在nHibernate中运行更新HQL查询?

如何在带有参数的spark中执行hql文件