【问题标题】:Find all items which contain certain set elements with JPA QL使用 JPA QL 查找包含某些集合元素的所有项目
【发布时间】:2023-03-18 13:40:01
【问题描述】:

我有一个 Item 类,其中包含 SetTag 对象。现在我想用 JPA 找到所有包含 all 所需标签的项目(基于 Hibernate 4.1.9)。

我的存储库方法获得了一个 java.util.Set,该方法的主体如下所示:

entityManager.createQuery("select item from Item as item where item.tags in :tags")
.setParameter("tags", tags)
.getResultList()

在我看来是这样的solution,但我得到的只是错误消息:

IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: 意外结束子树[从models.Item中选择项目作为item.tags in ()]

如果我扭转局面

"select item from Item as item where :tags in item.tags"

我认为正确(而不是上述查询),我在最后一行 (getResultList()) 中得到一个 NullPointerException

怎么了?

【问题讨论】:

  • 如果我在没有in 的情况下表达它,则不会引发异常。所以这似乎是一个纯粹的 JPQL 问题。我发布了另一个question

标签: java hibernate jpa jpql


【解决方案1】:

您的tags 集合似乎是空的,或者甚至可能为空,这会导致此错误(例如,请参阅this blog)。这会生成您在错误中看到的查询:

select item from models.Item as item where item.tags in ()

如果将其发送到数据库,可能会导致错误(例如,ERROR 1064 (42000),在 MySQL 中是语法错误)。

在将 tags 作为参数添加到查询之前,您需要验证它是非空的。

【讨论】:

  • tags 不为空并且包含预期的对象。还有其他想法吗?
  • 等一下,select item from Item as item where item.tags in :tags 我是否认为单个item 可能有多个tags?如WHILE 'list of tags' IN 'another list of tags'? IN 通常看起来更像WHILE 'single value (per record)' IN 'list of values'。老实说,我不太确定这究竟意味着什么,但 SQL 肯定不支持它。如果 Hibernate 实现了一些特殊的逻辑来支持它,我会觉得有点奇怪。
猜你喜欢
  • 2021-10-26
  • 1970-01-01
  • 2015-03-03
  • 1970-01-01
  • 1970-01-01
  • 2018-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多