【问题标题】:Max number of results from GraphQLGraphQL 的最大结果数
【发布时间】:2020-06-24 12:07:15
【问题描述】:

我正在使用 GraphQL-java 和 Hibernate 和 MariaDB 进行项目。 在我当前的解决方案中,我得到了 18938 个结果。我只想看看最后10个。所以我正在寻找一种解决方案来限制结果的数量。

在互联网上,我看到了限制结果数量的示例 (https://graphql.org/learn/pagination/)。他们称之为分页。但是,我找不到这个的服务器实现。有任何人对此有经验吗?

我有一个实体类,有一些属性:Test.java


@Entity
@Table(name = "test")
public class Test {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @NotNull
  @Size(max = 64)
  @Column(nullable = false)
  private String name;

  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "parent")
  private Test parent;


  public Test() {
  }

  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }


  public Test getParent() {
    return parent;
  }

  public void setParent(Test parent) {
    this.parent = parent;
  }


我的存储库类:TestRepository.java

public interface TestRepository extends CrudRepository<Test, Integer> {} 

我的 GraphQL 解析器类:Query.java

@Component
public class Query implements GraphQLQueryResolver {
  private TestRepository testRepository;

  @Autowired
  public Query(TestRepository testRepository) {
    this.testRepository = testRepository;
  }

  public Iterable<Test> findAllTests(Integer first) {
    return testRepository.findAll();
  }

  public long countTests() {
    return testRepository.count();
  }
}

我的 GraphQL 架构:test.graphqls

type Test {
  id: ID!
  name: String!
  parent: Test
}

#extend query
 type Query {
 findAllTests(first: Int): [Test]!
  countTests: Int!
}

【问题讨论】:

  • 也许 thisthis 会帮助你,但基本上你需要添加两个参数 skiplimit 来定义你的页面,然后在查询中使用它们。跨度>
  • 感谢您的回复。我也找到了那些文章。但我不知道如何在查询中使用它们。他们有不同的方法,我没有..
  • 好吧,我猜你可以在TestRepository 中添加带有两个参数skiplimit 的方法,然后在the query 中使用它们来返回结果。
  • 我是新手,我只知道如何将它们添加到 graphQL 解析器中。但我不知道如何在查询中使用它们并修改查询。所以这就是为什么我有这个问题..
  • 你可以找到一些例子here。由于您没有特定的问题,因此很难在 SO 上找到答案。您可以做的只是为您的子问题搜索解决方案,例如如何在 spring data 中编写查询graphql-java 分页,并应用试错法。这是最好的学习方式。

标签: java hibernate filter pagination graphql


【解决方案1】:

总结我的最后一条评论是我会做的:

  • 不是扩展CrudRepository,而是扩展PagingAndSortingRepository(扩展CrudRepository
public interface TestRepository extends PagingAndSortingRepository<Test, Integer> {
}
  • 在您的 Query 类中,将两个参数传递给 findAllTests 方法,pagesize 将用于创建 Pageable 对象
@Component
public class Query implements GraphQLQueryResolver {
  // other properties & methods are omitted for brevity

  public Iterable<Test> findAllTests(Integer page, Integer size) {
    Pageable pageable = PageRequest.of(page, size);
    return testRepository.findAll(pageable).getContent(); // findAll returns Page and we can get the underlying List with getContent
  }
}
  • 在您的 GraphQL 架构中从上面添加两个参数(我将默认页面大小设置为 20)
#extend query
type Query {
  findAllTests(page: Int = 0, size: Int = 20): [Test]!
  countTests: Int!
}

由于我没有使用 GraphQL 的经验,我不确定这是否有效,但如果有问题,您可以给我反馈。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 2012-07-03
    • 2016-12-25
    • 1970-01-01
    • 2022-11-29
    相关资源
    最近更新 更多