一尘不染

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

hibernate

如果将空列表传递到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规范中的支持。

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


阅读 450

收藏
2020-06-20

共1个答案

一尘不染

根据JPA 1.0规范中的 4.6.8 节的 表达式

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

换句话说,不管Hibernate解析查询和传递an的能力IN()如何,无论特定数据库是否支持此语法(PosgreSQL都不符合Jira问题),如果需要,都应在此处使用动态查询代码可移植(我通常更喜欢使用Criteria
API进行动态查询)。

2020-06-20