Hibernate中带有命名查询的可选参数?

在使用Hibernate时,有没有办法在命名查询中指定可选参数(例如,何时从表单提供搜索参数而不是所有参数都需要)? 我正在使用本机SQL查询,但问题可能也适用于命名的HQL查询。

我很确定答案是’不’,但我还没有在文档中找到明确的答案。

AFAIK,没有这样的东西所以你必须为此编写动态查询。 也许看一下之前的答案,展示如何在HQL中实现这一点(您可以转换为SQL),并展示Criteria API如何使其更简单,因此在我看来更适合这项工作。

更新:(回答OP的评论)使用Hibernate,使用遗留数据库确实很棘手。 也许您可以使用动态本机查询并返回非托管实体 。 但从长远来看,事情可能会变得更糟(我不能告诉你)。 也许Hibernate不是你的最佳选择,像iBATIS这样的东西可以为你提供所需的灵活性。

正如前面提到的问题的不同答案中所提到的,以下HQL构造对我有用:

select o from Product o WHERE :value is null or o.category = :value 

if:value作为null传入,返回所有Products。

另请参见可选参数或空参数

请注意,由于此错误 , 这在某些版本的Sybase中不起作用,因此以下是一种替代方法:

 select o from Product o WHERE isnull(:value, 1) = 1 or o.category = :value 

遗憾的是,“可选或空参数”下的解决方案不适用于IN列表。 我不得不改变查询,如下所示……

命名查询定义:

 select ls from KiCOHeader co ... join lu.handlingType ht where (:inHandlingTypesX = 1 OR ht.name in (:inHandlingTypes)) 

码:

 Set inHandlingTypes = ... Query query = persistence.getEm().createNamedQuery("NAMED_QUERY"); query.setParameter("inHandlingTypesX", (inHandlingTypes == null) ? 1 : 0); query.setParameter("inHandlingTypes", inHandlingTypes); List stocks = query.getResultList(); 

工作很有趣。

处理可选列表参数的另一种解决方案是使用COALESCE函数检查null。 Hibernate支持 COALESCE从列表中返回第一个非null参数,允许您在列表中有多个项目时检查列表上的null而不会破坏语法。

带有可选参数和列表参数的HQL示例:

 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方言。