如何在 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函数
如何在本机查询中使用 NVL 或 COALESCE 获取 Spring Data JPA 中的值列表