是否有任何方式指定可选择的参数(如当的搜索参数提供了从一种形式,并不是所有的参数是需要)在一个名为查询时使用 休眠?我使用的是一个司机 SQL 查询,但问题可能是适用的命名的 非常 查询。

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

有帮助吗?

解决方案

据我所知,没有这样的事情,所以你必须为此编写动态查询。也许看看这个以前的答案展示了如何在HQL做到这一点(你可以调换到SQL),也显示了标准API如何使它更简单,因此更适合这份工作在我看来。

更新:(回答来自OP评论)与遗留数据库工作可以用Hibernate确实棘手。也许你可以使用动态本地查询并返回非-managed实体虽然的。但是从长远来看,事情可能变得更糟(我不能告诉你)。也许Hibernate是不是在你的情况最好的选择,像iBATIS的会给你你需要的灵活性。

其他提示

如前所在 不同的答案 来的 的问题 引用的此前,以下非常建造工作对我来说:

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

如果 :value 通过作为 null, 所有的产品返回。

也参看 可选或空参数

注意,这不会的工作在某些版本的Sybase因 这个错误, ,因此下面是一个选择:

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

不幸的是在“可选或空参数”的解决方案并不在清单中工作。 我不得不改变沿袭了查询...

命名查询定义:

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服务器的方言。

有关具有NULL值那些具有的问题,另一种选择是使用一个替代的值。在我的情况下,我用于我的类别字段只有正值,即允许我作为我的备用值使用= -1。

因此,之前执行查询,就可以使一个小的验证:

if(value==null) {
   value = -1;
}
....
....
select p from Product p WHERE :value = -1 or p.category = :value
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top