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
相关产品推荐
相关产品推荐

