【问题标题】:Search among all values in PostgreSQL jsonb column using JPA Specification使用 JPA 规范在 PostgreSQL jsonb 列中的所有值中搜索
【发布时间】:2020-10-18 18:44:45
【问题描述】:

我想使用 JPA 规范在 PostrgeSQL 的 jsonb 列中的所有值中进行搜索。

我有下表:

 --------------------------------------------------------
| id | json_column                                      |
 ---- ------------ ----------- --------------------------
| 1  | {"property_1":"value_1", "property_2":"value_2"} |
 --------------------------------------------------------
| 2  | {"property_1":"value_1", "property_5":"value_5"} | 
 --------------------------------------------------------

如果我知道使用规范的字段名称,我可以在字段之间搜索匹配项,如下所示:

 public List<MyEntityWithJsonField> searchAmongJsonFields() {
        Specification<MyEntityWithJsonField> spec = (root, query, criteriaBuilder) -> {

            Expression<String> stringExpression = criteriaBuilder.function(
                    "jsonb_extract_path_text"
                    , String.class
                    , root.<String>get("json_column")
                    , criteriaBuilder.literal("property_1")
            );

            return criteriaBuilder.like(stringExpression, "%value%");
        };

        return myEntityWithJsonFieldRepository.findAll(spec);
 }

但是键的名称可能不同,也可能不存在,但我需要在这些未知字段(键)的所有“值”中寻找匹配项。

是否可以使用规范或使用本机查询来实现这一点?

不胜感激!

【问题讨论】:

    标签: java postgresql jpa jsonb


    【解决方案1】:

    如果我理解正确,您可以使用json_each_text() 函数。

    所以这将是“本机查询”解决方案:

    select t.id, json_object_agg(t.k, t.v) as json_column from (
        select your_table.id,  j.*  from your_table
        join lateral json_each_text(json_column) j(k,v) on true
        where
        j.v like '%value%'
    ) t
    group by id
    

    【讨论】:

    • 答案是一个更简单的请求:SELECT md.neededField_1, md.neededField_2, jv FROM my_database md JOIN LATERAL jsonb_each_text(json_data) as j(k,v) ON true WHERE jv LIKE '%value %';不幸的是,无法通过规范解决。使用本机请求。谢谢!
    • 是的,json_object_agg 只是建立原始行。很高兴为您提供帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 2021-09-27
    • 2018-04-08
    • 2015-08-15
    • 2021-05-30
    • 1970-01-01
    • 2021-05-23
    相关资源
    最近更新 更多