Максимальное количество результатов от GraphQL - PullRequest
0 голосов
/ 12 марта 2020

Я работаю над проектом с GraphQL- java и Hibernate с MariaDB. В моем текущем решении я получаю 18938 результатов назад. Я просто хочу увидеть последние 10 из них. Поэтому я ищу решение для ограничения количества результатов.

На inte rnet Я вижу примеры ограничения количества результатов (https://graphql.org/learn/pagination/). Они называют это нумерацией страниц. Тем не менее, я не могу найти серверную реализацию этого. У кого-нибудь есть опыт с этим?

У меня есть класс Entity с некоторыми свойствами: 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: Запрос. 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!
}

1 Ответ

0 голосов
/ 13 марта 2020

Подводя итог моему последнему комментарию, я бы сделал следующее:

  • Вместо расширения CrudRepository, расширение PagingAndSortingRepository (расширение CrudRepository)
public interface TestRepository extends PagingAndSortingRepository<Test, Integer> {
}
  • В вашем Query классе передайте два аргумента методу findAllTests, page и size, которые будут использоваться для создания 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, я не уверен если это работает, но вы можете дать мне обратную связь, если есть какие-то проблемы.

...