gpt4 book ai didi

java - 使用条件 API 搜索 jsonb 字段

转载 作者:行者123 更新时间:2023-12-02 06:52:05 25 4
gpt4 key购买 nike

我有一个实体,其中有一个 jsonb 类型的内容字段。该字段存储复杂的 json。我需要在这个领域做出选择。我使用标准 API。这样的查询有效:

public Predicate getPredicate(){
Expression<String> function = builder.function("jsonb_extract_path_text",
String.class,
root.<String>get("content"),
builder.literal("unit"),
builder.literal("id")
);
return builder.like(
function,
"%" + value + "%"
);
}

JSON 看起来像这样:

{
"unit":{
"id":"58bd51815744bf06e001b57b",
"name":"my name",
"another":{
"anotherId":"45545454"
}
}
}

问题在于 JSON 的搜索条件可能完全不同。也许有一个搜索:unit.id = 58bd51815744bf06e001b57b。可能是这样的:unit.another.anotherId = 45545454。甚至可能是这样的:unit.id = 58bd51815744bf06e001b57bunit.name =“我的名字”

我想我可以像这样解决我的问题:

Expression<String> function = builder.function("jsonb_extract_path_text",
String.class,
root.<String>get("content"),
builder.literal("$.unit.id")
);

但由于某种原因这不起作用。有什么想法可以解决这个问题吗?

最佳答案

我找到了解决办法:所以我使用 Spring 数据进行搜索

EntityAbstract one = entityRepository.findOne(((Specification<EntityAbstract>)
(root, query, builder) -> {
Expression<?>[] expressions = {root.<String>get("content"), builder.literal("unit"), builder.literal("id")};
return toPredicate(root, query, builder, projectionName, expressions);
}
)).orElseThrow(() -> new ResourceNotFoundException("Entity not found"));

这就是 Criteria Builder 的方法的样子

public Predicate toPredicate(Root<EntityAbstract> root, CriteriaQuery<?> query, CriteriaBuilder builder, String value, Expression<?>[] args) {
Expression<String> function = builder.function("jsonb_extract_path_text",
String.class, args
);
return builder.like(
function,
"%" + value + "%"
);
}

也就是说,我需要形成一个所需长度的数组(表达式),这并不难

关于java - 使用条件 API 搜索 jsonb 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59371719/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com