我正在尝试用子查询中的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。 谁能解释我做错了什么?
答案 0 :(得分:0)
在你的代码中:units
可能是一个集合(或者像这样),因为in
语句需要一个集合,如果没有,它就没有意义。但在when
条件:units is not null
中,:units
必须只有一个值(或NULL
),否则语法不正确。
如果你想检查:units
是否为空,那么你需要第二个参数,例如: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
然后有一个更简单的可能性,因为在SQL <expression> in (NULL)
中求值为false。只需做
and ti.toPrototype.unit in :units