使用Hibernate时,是否有任何方法可以在命名查询中指定可选参数(例如,何时从表单提供搜索参数而不是所有参数都需要)?我正在使用本机SQL查询,但问题可能也适用于命名的HQL查询。
我很确定答案是'不',但我还没有在文档中找到明确的答案。
答案 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