如何在Netflix DGS预加载的Shows Fetcher中获取Review的MyFilter参数?
在Netflix DGS中预加载Shows时获取Reviews的Filter参数方案
核心思路
在Shows的DataFetcher中,通过解析当前查询的选择集(Selection Set),找到reviews字段并提取其filter参数,再将该参数带入联表查询,一次性获取符合条件的Shows和关联Reviews。
具体实现步骤(Java示例)
在Shows的DataFetcher中解析选择集
通过DgsDataFetchingEnvironment获取查询的选择集,遍历找到reviews字段,从中提取filter参数:@DgsQuery public List<Show> shows(DgsDataFetchingEnvironment dfe) { MyFilter reviewFilter = null; // 从选择集中查找reviews字段 Optional<DgsField> reviewsField = dfe.getSelectionSet().getFields().stream() .filter(field -> "reviews".equals(field.getName())) .findFirst(); if (reviewsField.isPresent()) { // 提取filter参数,自动映射到MyFilter类型 reviewFilter = reviewsField.get().getArgument("filter", MyFilter.class); } // 执行联表查询,传入filter参数过滤reviews List<ShowWithReviews> showsWithReviews = showRepository.findShowsWithReviews(reviewFilter); // 转换为GraphQL的Show实体,预加载reviews数据 return showsWithReviews.stream().map(showWithReviews -> { Show show = new Show(); show.setShowId(showWithReviews.getShowId()); show.setTitle(showWithReviews.getTitle()); show.setReviews(showWithReviews.getReviews()); // 直接设置预加载的reviews return show; }).collect(Collectors.toList()); }处理Reviews的DataFetcher
由于已经预加载了符合条件的Reviews,Reviews的DataFetcher只需直接返回预加载的数据即可:@DgsData(parentType = "Show", field = "reviews") public List<Review> reviews(@Source Show show) { // 直接返回预加载的reviews,无需再次查询数据库 return show.getReviews(); }
注意事项
- 如果查询中没有请求
reviews字段,reviewsField会为空,此时只需查询Shows数据即可,无需联表。 - 若需要兼容“预加载+内存过滤”的场景,也可以在Reviews的DataFetcher中再次使用filter参数对预加载的列表做内存过滤,但推荐优先在数据库层面完成过滤以提升性能。
- 确保
Show实体类包含reviews的getter和setter,用于存储预加载的关联数据。
内容的提问来源于stack exchange,提问作者Lukáš Křečan
相关产品推荐
相关产品推荐

