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

Ick*_*ter 30 java orm hibernate hql named-query

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

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

Ian*_*nes 39

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

select o from Product o WHERE :value is null or o.category = :value
Run Code Online (Sandbox Code Playgroud)

如果:value传入,null则返回所有产品.

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

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

select o from Product o WHERE isnull(:value, 1) = 1 or o.category = :value
Run Code Online (Sandbox Code Playgroud)


Pas*_*ent 14

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

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


小智 7

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

命名查询定义:

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

码:

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();
Run Code Online (Sandbox Code Playgroud)

工作很有趣.


小智 5

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

带有可选参数和列表参数的 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 )
Run Code Online (Sandbox Code Playgroud)

这对我使用 SQL Server 方言很有用。