Критерии API в Spring Boot - PullRequest
       9

Критерии API в Spring Boot

0 голосов
/ 22 февраля 2019

У меня есть следующая (упрощенная) структура сущности:

public class Animal {
  private long id;
  private int regionId;
  private int categoryId;
  @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "animal")
  private List<Attributes> attributes;
}

public class Attributes {
  private long id;
  @ManyToOne(fetch = FetchType.LAZY)
  private Animal animal;
  private String name;
  private String value;
  @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
  private Detail detail;
}

public class Detail {
  private long id;
  private String size;
  private String type;
}

Это часть приложения Spring Boot.

Я бы хотел получить запрос Animal как по своим собственным атрибутам, так и по атрибутам в Подробности .

Мой запрос должен выглядеть следующим образом:

GET: /animal/{regionId}/{categoryId}?size=medium,large&type=carnivorous,herbivore

Это будет означать, что мне нужнозапросить всех животных, которые имеют определенные regionId и categoryId и которые также имеют Подробности с размером и типом в пределах предоставленного списка значений.Кроме того - и я думаю, что это сложная часть - параметры size и type являются необязательными, поэтому запрос должен учитывать это.

В настоящее время у меня естьPlanReposiory, которая расширяет CrudRepository и предоставляет основные методы запросов для сущности Plan .

Я пытался обернуть голову вокруг API Criteria, чтобы найти способ использовать его для достижения этой цели., но я не понимаю, как я могу поместить все это в моем хранилище.Есть идеи?

1 Ответ

0 голосов
/ 22 февраля 2019

Вы должны взглянуть на спецификации JPA Spring Data:

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#specifications

Вы должны расширить свой репозиторий из JpaSpecificationExecutor

public interface CustomerRepository 
       extends CrudRepository<Customer, Long>, JpaSpecificationExecutor {
 …
}

И тогда выметод findAll, который принимает параметр спецификации:

List<T> findAll(Specification<T> spec);

Затем вы можете создать свою спецификацию на основе параметров, переданных в URL:

public static Specification<Animal> bySizeAndType(String size, String type) {

    return new Specification<Animal>() {

      public Predicate toPredicate(Root<Animal> root, CriteriaQuery<?> query,
            CriteriaBuilder builder) {

         // JOIN Attributes
         // JOIN Detail

         if (size != null) {
           // add condition
         }
         if (type != null) {
           // add condition
         }

         return builder.where(...);
      }
    };
  }

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...