如何在HQL中模拟NVL

时间:2009-03-02 08:22:13

标签: hibernate hql

我试过了:

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

但它恰好发生了

from Table where :par1 is null

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

,而

 select * from table where col1 = 'asdf'

不会返回任何行。

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

2 个答案:

答案 0 :(得分:62)

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

所以你想要的东西是:

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

答案 1 :(得分:3)

如果你的底层数据库是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。 希望它有所帮助。