0

サブクエリに case ステートメントを含む hql クエリを作成しようとしています。

select zr 
from ZipResource zr 
inner join zr.zipInflows zi 
inner join zi.toInstInflows tii 
inner join tii.toInstance ti 
where ti.state = 'COMPLETED' 
and 
ti.completedDate between :dateFrom and 
:dateTill 
and (
case when :units is not null then
( ti.toPrototype.unit in :units) end ) 
order by tii.zipInflow.zipResource.name

このようなことをするのは本当ですか?このクエリでは、case ステートメントで QuerySyntaxException が発生しました。誰かが私が間違っていることを説明できますか?

4

1 に答える 1

0

あなたのコード:unitsにはおそらくセット(またはこのようなもの)があります。これは、inステートメントにセットが必要なためです。そうでない場合、意味がありません。ただし、when条件には単一の値 (または ) が 1 つだけ:units is not null存在する必要があります。そうでない場合は、構文的に正しくありません。:unitsNULL

が nullかどうかを確認する場合:unitsは、2 番目のパラメーターが必要です。たとえば:number_of_units、次のように確認します。

and (
   case when :number_of_units != 0 then
   ( ti.toPrototype.unit in :units) end ) 

ところで、あなたのcase発言は余計です。単純なand条件で処理できます (データベースが検索インデックスを探すときに条件をより適切に処理できるため、推奨されます):

and :number_of_units != 0
and ti.toPrototype.unit in :units 

<expression> in (NULL)SQL ではfalse と評価されるため、さらに単純な可能性があります。単純に

and ti.toPrototype.unit in :units 
于 2013-03-19T10:32:16.237 に答える