Spring Jpa - игра с несколькими методами findby в коде - PullRequest
1 голос
/ 27 апреля 2020

У меня есть базовый API загрузки Spring в верхней части моей системы rdbms, я выполняю все операции, но когда речь идет о выборе данных из системы, моя конечная точка отображения GET имеет много проверок, которые решают, какой метод findbyAttributes следует вызвать.

Я создал несколько методов репозитория, таких как findbyId, findbyIdAndName findbyIdAndNameAndAge.

Но рассмотрим мой сценарий, в котором у меня около 30 столбцов в таблице, которые конечный пользователь может захотеть запросить в какой-то момент времени используя мою конечную точку GET, чего я достиг, но из-за увеличения количества запросов, приходящих на каждый столбец / атрибуты моей сущности, моя когнитивная сложность кода значительно возросла.

Я знаю, что должен быть какой-то другой способ, чем Вызов каждого метода findby за несколькими циклами if-else, что, мне кажется, слишком плохо.

В настоящее время мой код выглядит так -

public Page<myEntity> getDataFromDatabase(
      @RequestParam(value = "id", required = false, defaultValue = "NA") String id,
      @RequestParam(value = "name", required = false, defaultValue = "NA") String name,
      @RequestParam(value = "age", required = false, defaultValue = "NA") String age,
      @RequestParam(value = "address", required = false, defaultValue = "NA") String address,
      Pageable pageable) {

    Page<myEntity> finalData = null;

    if (!id.equals("NA")
        && name.equals("NA")
        && age.equals("NA")
        && address.equals("NA")) {
      finalData = service.findById(id, pageable);

    } else if (id.equals("NA")
        && !name.equals("NA")
        && age.equals("NA")
        && address.equals("NA")) {
      finalData = service.findByName(name, pageable);
    } else if (id.equals("NA")
        && name.equals("NA")
        && !age.equals("NA")
        && address.equals("NA")) {
      finalData = service.findByAge(age, pageable);
    } else if (id.equals("NA")
        && name.equals("NA")
        && age.equals("NA")
        && !address.equals("NA")) {
      finalData = service.findByAddress(address, pageable);
    }else if (!id.equals("NA")
        && !name.equals("NA")
        && !age.equals("NA")
        && !address.equals("NA")) {
      finalData = service.findByIdAndNameAndAgeAndAddress(id,name,age,address, pageable);
    }else if (!id.equals("NA")
        && !name.equals("NA")
        && age.equals("NA")
        && address.equals("NA")) {
      finalData = service.findByIdAndName(id,name, pageable);
    }
    // few more else if as new column is being added
    // I think I did it but this will not last for long 

}

Поймите, хочу ли я добавить все атрибуты findBy на основе упомянутых условных логик c.

Если кто-то может помочь в этом, что заставило бы мой день сиять.

Примечание. Я читал о Спецификации Jpa , где они отображаются как метод findAll logi c с несколькими спецификации, которые к тому же кажутся такими же, как каждый раз, когда мне нужно создать определенную базу условий, вызывающую каждый метод get.

Также, пожалуйста, дайте мне знать, если это правильный подход к go с, моя идея написать меньше кода с лучшими практиками, поэтому из конечной точки GET все методы findby JpaRepository могут быть вызваны только через каркас, мне не нужно писать несколько if-else.

1 Ответ

1 голос
/ 27 апреля 2020

Вы должны действительно рассмотреть спецификацию Jpa, это, вероятно, лучшее решение. С помощью этого метода будет легко построить ваши спецификации, даже для 30 атрибутов.

Вы также можете проверить Запрос Hibernate

Сначала создайте метод, подобный этому

 public Specification<MyEntity>  myEntitySpecification(String id, String name) {
         return (root, criteriaQuery, criteriaBuilder) -> {

            List<Predicate> predicateList  = new ArrayList<>();
            if (!id.equals("NA")){
                predicateList.add(criteriaBuilder.equal(root.get("id"), id));
            }
            if (!name.equals("NA")){
                predicateList.add(criteriaBuilder.equal(root.get("name"), name));
            }

            return criteriaBuilder.and(predicateList.toArray(new Predicate[predicateList.size()]));
        };
    }

Тогда назовите это


    public Page<MyEntity> getDataFromDatabase(
            @RequestParam(value = "id", required = false, defaultValue = "NA") String id,
            @RequestParam(value = "name", required = false, defaultValue = "NA") String name,
            @RequestParam(value = "age", required = false, defaultValue = "NA") String age,
            @RequestParam(value = "address", required = false, defaultValue = "NA") String address,
            Pageable pageable) {



        Page<MyEntity> finalData = testRepository.findAll(myEntitySpecification(id, name), pageable);

return finalData ;
}
...