如何使用 spring 数据规范查询 jsonb 列?

Ram*_*amu 5 criteria spring-data

我有下表temp_tbl (postgres):

    ID(int)     NAME(TEXT)    LINKS(jsonb)
    --------    ----------    -------------------
    1           Name1         ["1","23","3", "32]
    2           Name2         ["11","3","31", "2]
    3           Name3         ["21","13","3", "12]
Run Code Online (Sandbox Code Playgroud)

现在,我的本机查询获取具有值为“3”的“LINKS”的行是:

    select * from temp_tbl where links @> '["3"]'
Run Code Online (Sandbox Code Playgroud)

返回第 2 行和第 3 行。

我想使用 org.springframework.data.jpa.domain.Specification 实现这个查询

我已经实现了类似下面的内容,其中 jsonb 列不是数组,但使用jsonb_extract_path_text具有键值 json 。但是上面的列只存储数组中的值。

我的实体类。

    ID(int)     NAME(TEXT)    LINKS(jsonb)
    --------    ----------    -------------------
    1           Name1         ["1","23","3", "32]
    2           Name2         ["11","3","31", "2]
    3           Name3         ["21","13","3", "12]
Run Code Online (Sandbox Code Playgroud)

我需要帮助使用标准构建器将上述查询转换为规范。

小智 2

使用 Jpa 规范检查 jsonb 数组是否包含字符串的一种方法是使用函数jsonb_containsjsonb_build_array,后者用于将字符串更改为 jsonb 数组以在 中使用jsonb_contains

    public static Specification<TempTbl> linkInLinks(String linkId) {
        return (root, query, builder) -> {
            Expression toJsonbArray = builder.function("jsonb_build_array", String.class, builder.literal(linkId));
            return builder.equal(builder.function("jsonb_contains", String.class, root.get("linkIds"), toJsonbArray), true);
        };
    }
Run Code Online (Sandbox Code Playgroud)