很不幸,“Optional or Null Parameters”下的解决方案不能用于IN列表。
我不得不按照以下方式更改查询...
命名查询定义:
select ls from KiCOHeader co
...
join lu.handlingType ht
where (:inHandlingTypesX = 1 OR ht.name in (:inHandlingTypes))
代码:
Set<KiHandlingTypeEnum> inHandlingTypes = ...
Query query = persistence.getEm().createNamedQuery("NAMED_QUERY");
query.setParameter("inHandlingTypesX", (inHandlingTypes == null) ? 1 : 0);
query.setParameter("inHandlingTypes", inHandlingTypes);
List<KiLogicalStock> stocks = query.getResultList();
工作非常有趣。
select obj from MyEntity obj
where ( COALESCE( null, :listParameter ) is null or obj.field1 in (:listParameter) )
and ( :parameter is null or obj.field2 = :parameter )
这对我来说在使用SQL Server方言时有效。
:listParameter
时抱怨COALESCE(null, )
。我的解决方案是传递一个额外的参数,并以这种方式编写where条件:(:listParamterSize = 0 或 obj.field1 在 (:listParameter) 中)
- jeremija:listParameter
必须被定义,至少为null。这种解决方案的优点是您可以将参数传递为null,而不需要额外的参数。 - Daniel Olszewski对于那些遇到 NULL 值问题的人,另一个选项是使用替代值。在我的情况下,我仅使用正值作为我的类别字段,这使我可以使用 -1 作为我的替代值。
因此,在执行查询之前,您可以进行小型验证:
if(value==null) {
value = -1;
}
....
....
select p from Product p WHERE :value = -1 or p.category = :value
.. WHERE isnull(:value, o.category) = o.category ..
。 - Siamand