当前位置: 首页 > 知识库问答 >
问题:

JPQL如何查询集合(或集合)中具有嵌套值的给定参数?

卢权
2023-03-14

我有一个实体Foo,包含Bars的嵌入式集合。

@Entity
@Table(name = "foo")
public class Foo {

    @ElementCollection(fetch = FetchType.EAGER)
    @CollectionTable(name = "bar", joinColumns = @JoinColumn(name = "foo_id"))
    private Set<Bar> bars = new HashSet<>();
    
    //...
}

@Embeddable
public class Bar {

    @Column(name = "value", nullable = false)
    private String value;

    //...
}

我想找到集合中与给定参数(字符串)匹配的所有Foos。

我想在JPQL中实现的一些伪代码:

Foo find(String toMatch) {
    return allFoos.stream()
            .filter(f -> f.getBars.stream()
                    .map(Bar::getValue)
                    .anyMatch(value -> value.equals(toMatch)))
            .findFirst()
            .get();
}

但是,当我尝试此查询时:

@Repository
public interface FooRepository extends JpaRepository<Foo, Long> {
    @Query("select f from Foo f " +
            "where (" +
            "  :toMatch in f.bars.value " +
            ")")
    Optional<Foo> find(@Param("toMatch") String toMatch);
}

它抛出:

Caused by: org.hibernate.QueryException: illegal attempt to dereference collection [foo.id.bars] with element property reference [value]

我希望避免使用需要连接多个表的解决方案。这是伪代码,但实际查询中充满了大量复杂的大型企业sql where或and语句。所以越少加入越好。

共有1个答案

羊舌青青
2023-03-14

我相信正确的JPQL查询应该是这样的:

select f from Foo f where f.id in (
 select b.id from f.bars b where b.value=:toMatch
)
 类似资料:
  • 我有一个实体,包含s的嵌入式集合。 我想在Set中找到与给定参数(String)匹配的所有s。 我想在JPQL中实现的一些伪代码: 但是,当我尝试这个查询时: 它抛出: 由以下原因引起:org.hibernate.QueryException:非法尝试使用元素属性引用[value]取消引用集合[foo.id.bars] 我希望避免使用需要连接多个表的解决方案。这是伪代码,但实际查询中充满了大量复杂

  • 问题内容: 我想找到在其标签集中包含 所有 给定标签的项目。 以下是简化的类: 如果我这样尝试 我得到包含 任何 给定标签的项目。这不足为奇,但我希望包含 所有 给定标签的项目。所以我尝试另一种方式: 我收到错误消息。如果仅包含一个标签,它将起作用,但失败的原因不止于此。 如何在JPQL中表达呢? 问题答案: 诀窍是使用计数:

  • 问题内容: 我想找到在其标签集中包含 所有 给定标签的项目。 以下是简化的类: 如果我这样尝试 我得到包含 任何 给定标签的项目。这不足为奇,但我希望包含 所有 给定标签的项目。所以我尝试另一种方式: 我收到错误消息。如果仅包含一个标签,它将起作用,但失败的原因不止于此。 如何在JPQL中表达呢? 问题答案: 诀窍是使用计数:

  • 问题内容: 我在Scala和Java之间遇到编译问题。 我的Java代码需要一个 我的scala代码有一个 我收到编译错误: 似乎scala.collection.JavaConversions不适用于嵌套集合,即使Vector可以隐式转换为Iterable。除了遍历scala集合并手动进行转换之外,我还能做些什么使这些类型起作用? 问题答案: 应该弃用恕我直言。您最好使用来明确说明转换的时间和地

  • 问题内容: 我正在写一个JPQL查询,它基于 Categories 集合进行查询。我的类别可以为空,因此我正在使用:categories = NULL进行检查。 当类别为NULL时,以上方法可以正常工作。但是,当类别超过一个值时,我得到了错误 java.sql.SQLException:操作数应包含1列 与hibernate有关的痕迹是 (?,?)或(?,?)中的category6_.catego

  • 是否可以在Firestore中查询嵌套文档,而不向方法?我想通过循环所有用户ID并获取所有用户帖子来获取所有用户创建的所有帖子。 下面是我使用的代码。 谢谢。 不会在主机上显示任何内容。在控制台上显示“未来”的实例。 Firestore结构: 帖子 -