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

如何在Set(或Collection)中查询具有嵌套值的给定参数?

越鸿才
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;

    //...
}

我想在Set中找到与给定参数(String)匹配的所有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);
}

它抛出:

由以下原因引起:org.hibernate.QueryException:非法尝试使用元素属性引用[value]取消引用集合[foo.id.bars]

我希望避免使用需要连接多个表的解决方案。这是伪代码,但实际查询中充满了大量复杂的大型企业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的嵌入式集合。 我想找到集合中与给定参数(字符串)匹配的所有s。 我想在JPQL中实现的一些伪代码: 但是,当我尝试此查询时: 它抛出: 我希望避免使用需要连接多个表的解决方案。这是伪代码,但实际查询中充满了大量复杂的大型企业sql where或and语句。所以越少加入越好。

  • 我有这样嵌套条目的文档: 因此,第二个条目中的*是实际的字符串值,而不是通配符。 现在,我正尝试使用以下主体查询具有key1:value3和key2:*的所有文档: 但是,这根本不会返回任何文档。 此外,使用“\\*”作为key2的查询参数也没有帮助。 是否有可能将*作为实际的String值而不是通配符查询? 第一次回答后编辑,并提示Analyzer设置:尝试将我的索引配置为使用映射字符过滤器,如

  • 我在JPA repository类中编写了一个查询,如下所示: 上述查询的问题是,如果参数:和都为空,则需要获取所有记录,而这不会发生。到目前为止,没有获取任何记录。 基本上,我希望编写的查询能够正确地适用于所有情况,即参数和都采用空值和非空值。 在这方面,我已经了解了CriteriaBuilder的概念,但无法正确掌握该概念以实现我的案例。 有人能帮忙吗?谢谢 编辑 我已经在控制台中记录了查询,

  • 我正在努力编写一个具有多个和/或条件的弹性搜索查询。 它的基本逻辑如下: 正如docs中提到的,如果一个文档只满足must子句,那么它就被认为是匹配的。在这种情况下,should子句起到增强作用,即如果文档除了mouth子句之外还匹配一个或多个should子句,那么它将具有更高的相关性得分,假设cond2、cond3和cond4是计算相关性得分的查询。 问题是我只想要至少匹配OR条件之一的文档。

  • 我正在用Swagger 2.0记录一个Rails应用程序,并使用Swagger-UI作为人类可读的文档/沙盒解决方案。 我有一个资源,客户端可以在其中存储任意元数据以供以后查询。根据 Rails 约定,查询将按如下方式提交: Rails将其转换为以下参数: 它可以很容易地用于为数据库生成适当的 子句。 Swagger里有支持这种东西的吗?我想最终让Swagger-UI提供一些方法来修改生成的请求,

  • 我正在尝试正确定义 OpenAPI 规范,以便从该规范生成 api 客户端。我已经解决了一个问题,即我们有一个复杂的查询对象,其中包含嵌套对象和对象数组,用于获取 GET 路由。 让我们以这些类为例。 和一个带有@Query decorator的get请求。 我得到的是。 我还尝试通过添加@ApiQuery装饰器来定义查询参数,它几乎可以工作。 - 但是现在我正在将重复的查询定义混入一个。有没有办