web-dev-qa-db-ja.com

HQLでNVLをシミュレートする方法

私はこれを試しました:

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

しかし、それは起こります

from Table where :par1 is null

:par1がnullでない場合でも、常にテーブルのすべての行を返します。

ながら

 select * from table where col1 = 'asdf'

行を返しません。

アプリケーションが別のデータベースエンジンで実行されることになっているため、ネイティブの文法を使用できません。

29
Pau

HQLのnvlコマンドに相当するのがcoalesceコマンドです。 aがnullでない場合、coalesce(a,b)aを返し、それ以外の場合はbを返します。

したがって、次の行に何かが必要です。

from Table where col1 = coalesce(:par1, 'asdf')
62
Il-Bhima

基礎となるデータベースが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でのみ使用したため、他のデータベースの実装については不明です。それが役に立てば幸い。

3
Vikash Mishra