В JpaRepository, если один параметр является общим для многих методов запроса, то как сделать как можно лучше в репозитории и в службе также

public interface UserRepo extends JpaRepository<User, Long> {

    public List<User> findById(long id);

    public List<User> findByEmail(String email);

    public List<User> findByEmailAndCode(String email, Code code);

    public List<User> findByEmailAndClassType(String email, ClassType code);

}

public class UserService {
    @Autowired
    UserRepo userRepo;

    public List<user> fetchByClassType(ClassType ct) {
        return userRepo.findByEmailAndClassType("email", ct);
    }

}

here email need to fetch once how to avoid it many time to go on database or any other solution in controller it need to give again and again in each request mapping ...suggest

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
156
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вместо того, чтобы создавать кучу похожих методов репозитория, вы можете использовать технические характеристики.

См. Документ здесь: https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#specifications

Вам необходимо расширить JpaSecificationExecutor:

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

Затем вы получите метод findAll (), который принимает спецификацию.

Создайте спецификацию, например:

 public static Specification<Customer> isLongTermCustomer() {
    return new Specification<Customer>() {
      public Predicate toPredicate(Root<Customer> root, CriteriaQuery<?> query,
            CriteriaBuilder builder) {

         LocalDate date = new LocalDate().minusYears(2);
         return builder.lessThan(root.get(_Customer.createdAt), date);
      }
    };
  }

Или, если вам не нравится API критериев JPA, вы также можете использовать QueryDSL:

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#core.extensions.querydsl

его красивое решение помогает в поиске

Feroz Mujawar 03.08.2018 22:13

но дело в том, что если findBySubject (role, subject) findByClassType (role, classtype) и т.д. здесь каждый раз, когда требуются роли, в этом случае, какой удобный способ, пожалуйста, предложите

Feroz Mujawar 03.08.2018 22:13

Другие вопросы по теме