java - hibernate JPA : 'IS EMPTY' condition doesn't work for collections passed as parameters

标签 java hibernate jpa spring-boot spring-data-jpa

我正在尝试编写一个查询,其中需要检查作为参数传递的集合是否为空

我正在写这样的东西:

@Query("SELECT u FROM User u" +
        "WHERE" +
        "   :ids IS EMPTY" +
        "   OR u.id IN :ids")
Collection<User> findUsers(@Param("ids") Collection<String> ids);

此代码在启动时失败,并出现 QuerySyntaxException: ???未映射。堆栈跟踪没有提供任何有值(value)的信息,但我发现如果删除下一部分:

:ids IS EMPTY

它开始工作。

问:如何使用IS EMPTY作为查询参数?或者如何以其他方式检查集合是否为空?

注意:

  • 我正在使用 Spring Boot 1.5.8.RELEASE。
  • 我还看过"Passing empty list as parameter to JPA query throws error"这是不同的并且没有帮助。
  • 我发布的代码很原始,添加它只是为了说明目的,我的实际查询非常复杂,我确实需要检查集合是否为空。

最佳答案

JPA 文档明确指出,您应该避免使用空集合作为参数。

4.6.8 JPA 1.0 规范中的表达式

There must be at least one element in the comma separated list that defines the set of values for the IN expression.

如果你仔细想想,JPA 对此无能为力。如果查询包含 WHERE id in ?0 - 如何处理空集合? WHERE id in () 是无效语法,以及 WHERE id in...因此需要删除整个 where 约束,这不是我们想要的在大多数情况下。

猜测您需要在应用程序中而不是在查询级别处理此问题。

Side-Node:如果您使用只有很少选项的过滤器值,如果用户没有选择某些内容,则可以通过添加所有 id 来获得结果,即

where color_id in (1,2,..,10) and type_id in (1,2,3) AND tile_id in (1,2,..,5)
instead of the invalid
where color_id in () and type_id in () AND tile_id in ()

如果您有数千个选项,则不起作用,否则您将超出查询长度。

关于java - hibernate JPA : 'IS EMPTY' condition doesn't work for collections passed as parameters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48283387/

相关文章:

JAVA数据覆盖错误

hibernate - 按(链接)列排序,该列可以为空

java - Spring Data的跨存储持久化是否支持Do​​cument->JPA或Collections?

Java多线程时间切换

java - "The prefix "xliff "for element "xliff :g "is not bound"

java - CPLEX 目标函数错误

hibernate - 为什么不推荐 HibernateDaoSupport?

带有 SQL Server 的 Java JPA/Hibernate - 如何检测数据库中的列何时未被实体模型映射?

java - 无法将类型 'java.lang.String' 的属性值转换为属性 'java.util.Date' : it is not exactly10characters long 所需的类型 'date'

java - JPA 添加逻辑以删除实体