将空列表作为参数传递给 JPA 查询会引发错误

新手上路,请多包涵

如果我将一个空列表传递给 JPA 查询,我会收到一个错误。

例如:

 List<Municipality> municipalities = myDao.findAll();  // returns empty list
em.createQuery("SELECT p FROM Profile p JOIN p.municipality m WHERE m IN (:municipalities)")
    .setParameter("municipalities", municipalities)
    .getResultList();

因为列表是空的,Hibernate 在 SQL 中将其生成为“IN ()”,这让我在 Hypersonic 数据库中出错。

Hibernate 问题跟踪 中有一张票,但那里的评论/活动不多。我不知道其他 ORM 产品或 JPA 规范中的支持。

我不喜欢每次都必须手动检查空对象和空列表的想法。是否有一些众所周知的方法/扩展?你如何处理这些情况?

原文由 Tuukka Mustonen 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

根据 JPA 1.0 规范中的 表达式中的 4.6.8 部分:

逗号分隔列表中必须至少有一个元素定义了 IN 表达式的一组值。

换句话说,无论 Hibernate 是否能够解析查询并传递 IN() ,无论特定数据库是否支持此语法(根据 Jira 问题,PosgreSQL 不支持),您都应该使用如果您希望代码可移植(我通常更喜欢使用 Criteria API 进行动态查询),请在此处进行动态查询。

原文由 Pascal Thivent 发布,翻译遵循 CC BY-SA 2.5 许可协议

假设 SQL 查询是这样的

(COALESCE(:placeHolderName,NULL) IS NULL OR Column_Name in (:placeHolderName))

现在,如果 List 是 String 类型,那么您可以传递为

query.setParameterList("placeHolderName",
!CollectionUtils.isEmpty(list)? list : new ArrayList<String>(Arrays.asList("")).

如果列表包含整数值,则语法如下所示:

 If(!CollectionUtils.isEmpty(list)){
query.setParameterList("placeHolderName",list)
}else{
query.setParameter("placeHolderName",null, Hibernate.INTEGER)
}

原文由 r_divyas 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题