You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中如何创建含复合多条件过滤的GraphQL查询?

正确实现GraphQL多条件过滤的Java代码

你之前的写法存在两个核心问题:

  • GraphQL不允许同一个参数(比如filter)重复传递,多个过滤条件必须合并到同一个filter对象中
  • 直接写DBfield2: 'X', 'Y', 'Z'不符合GraphQL语法,多值匹配需要借助后端支持的操作符或逻辑组合实现

根据你的需求,以下是两种可行的实现方案,具体选择取决于你的GraphQL后端Schema支持的过滤规则:

方案一:使用in操作符(推荐,若后端支持)

如果后端过滤规则支持in操作符匹配多个字符串值,可将DBfield2的条件写成in: ["X", "Y", "Z"],与DBfield1的条件合并到同一个filter内:

public JsonNode createQuery() {
     
    ObjectNode res = this.mapper.createObjectNode();
    String keys = this.syncProperties.getMapping().keySet().stream().collect(Collectors.joining(","));
    String lastUpdate = this.syncProperties.getlastUpdate();
        
    res.put("query",
        String.format("{alleDatensaetze(filter: {DBfield1: 122, DBfield2: {in: [\"X\", \"Y\", \"Z\"]}}, timestamp: \"%s\"){ %s }}", lastUpdate, keys)); 
    return res;
}

方案二:使用AND+OR逻辑组合

如果后端不支持in操作符,可通过AND包裹DBfield1的条件,同时用OR组合DBfield2的多值匹配条件:

public JsonNode createQuery() {
     
    ObjectNode res = this.mapper.createObjectNode();
    String keys = this.syncProperties.getMapping().keySet().stream().collect(Collectors.joining(","));
    String lastUpdate = this.syncProperties.getlastUpdate();
        
    res.put("query",
        String.format("{alleDatensaetze(filter: {AND: [{DBfield1: 122}, {OR: [{DBfield2: \"X\"}, {DBfield2: \"Y\"}, {DBfield2: \"Z\"}]}]}, timestamp: \"%s\"){ %s }}", lastUpdate, keys)); 
    return res;
}

额外说明

  • 去掉了原代码中replaceAll("###", "\"")的写法,直接在String.format中使用转义双引号\",更简洁且不易出错
  • 请确保后端GraphQL Schema确实支持对应的过滤操作符(in/AND/OR),若不确定可查看后端的Schema定义或相关文档

内容的提问来源于stack exchange,提问作者Lie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 03:22:53