2

我在使用 CriteriaBuilder 通过 Postgres JSONB 列检索/搜索时遇到问题。

Postgres 查询:SELECT * FROM table where lower(jsonb_extract_path(tags,'Case')::text) = lower('"normal"') as text));

标签:标签列的数据类型为 JSONB。

上面的查询使用 postgres 客户端工作正常。

但是我在尝试从 CriteriaBuilder 完成它时遇到了问题。

以下是我的代码:

    private Specification<TemplateMetadata> findByTagsFilter(Map<String, String[]> requestParameterMap) {
        return (root, query, builder) -> {
            List<Predicate> predicates = new ArrayList<>();
            if (!StringUtils.isEmpty(requestParameterMap)) {
                predicates = requestParameterMap.entrySet().stream()
                        .filter(keyValue1 -> validateKeyValues(keyValue1.getKey()))
                        .map(keyValue2 -> Arrays.asList(keyValue2.getValue()).stream()
                                .map(v -> builder.equal(builder.function("jsonb_extract_path", String.class, builder.lower(root.<String>get("tags")), builder.literal(keyValue2.getKey())) , builder.lower(builder.literal("\""+v+"\"")).as(JsonDataType.class)))
                        .flatMap(list -> list.distinct())
                        .collect(Collectors.toList());
            }
            return builder.and(
                    predicates.toArray(new Predicate[predicates.size()])
            );
        };
    }

requestParameterMap 由 REST 填充(API URI 应如下所示:?testtag1=testtag1&testtag2=testtag2

我收到以下错误

ERROR: function lower(jsonb) does not exist\n  Hint: No function matches the given name and argument types. You might need to add explicit type casts.\n  Position: 444

有人可以帮我解决这个问题。

4

0 回答 0