Java 使用标准API搜索jsonb字段

Java 使用标准API搜索jsonb字段,java,json,postgresql,hibernate,criteria-api,Java,Json,Postgresql,Hibernate,Criteria Api,我有一个实体,其中有一个jsonb类型的内容字段。复杂的json存储在此字段中。我需要在这个领域做出选择。我使用标准API。这样的查询工作: public Predicate getPredicate(){ Expression<String> function = builder.function("jsonb_extract_path_text", String.class, root.<Str

我有一个实体,其中有一个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。它可能是这样的:unit.other.anotherId=455454。 甚至可能是这样:unit.id=58bd51815744bf06e001b57b和unit.name=“我的名字”

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

{
 "unit":{
   "id":"58bd51815744bf06e001b57b",
   "name":"my name",
   "another":{
     "anotherId":"45545454"
   }
 }
}
Expression<String> function = builder.function("jsonb_extract_path_text",
        String.class,
        root.<String>get("content"),
        builder.literal("$.unit.id")
);
Expression function=builder.function(“jsonb\u extract\u path\u text”,
String.class,
root.get(“内容”),
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"));
EntityAbstract one=entityRepository.findOne(((规范)
(根目录、查询、生成器)->{
Expression[]expressions={root.get(“content”)、builder.literal(“unit”)、builder.literal(“id”)};
返回toPredicate(根、查询、生成器、projectionName、表达式);
}
)).orelsetrow(()->new ResourceNotFoundException(“未找到实体”);
这就是使用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 + "%"
    );
}
公共谓词toPredicate(根根、CriteriaQuery查询、CriteriaBuilder、字符串值、表达式[]参数){
Expression function=builder.function(“jsonb\u extract\u path\u text”,
String.class,args
);
返回生成器类(
功能,
“%”+值+“%”
);
}
也就是说,我需要形成一个所需长度的数组(表达式),这并不困难