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

时间:2010-03-15 01:41:36

标签: java hibernate orm hql named-query

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

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

4 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:7)

遗憾的是,“可选或空参数”下的解决方案不适用于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();

工作很有趣。

答案 2 :(得分:2)

处理可选列表参数的另一个解决方案是使用COALESCE函数检查null。 COALESCE是supported by Hibernate从列表中返回第一个非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方言。

答案 3 :(得分:0)

对于那些具有NULL值的问题,另一种选择是使用备用值。就我而言,我仅对类别字段使用正值,这使我可以将其用作备用值= -1。

因此,在执行查询之前,您可以进行小的验证:

while(1):                                           
    cadena += s.recv(1)                            
    if (((cadena)[i])=='\n'):       
        print(cadena.decode('ASCII'))               
        cadena=b''                                  
        i=-1                                        

    i+=1