Dynamic Projection в Spring Data JPA



Используя Spring Data, довольно часто могут возникать накладные расходы из-за получения из базы слишком большого количества полей. Чтобы решить эту проблему, мы можем объявлять методы с нативными запросами, DTO или проекциями для случаев, когда необходимо ограничить количество выбираемых полей. Но такой подход приводит к появлению множества очень похожих методов в репозитории. Например:





public interface ProductRepository extends JpaRepository<Product, Long> {

List<Product> findByName(String name); // выбираем из базы сущность со всеми её полями



List<ProductProjection> findPrjsByName(String name); //выбираем из базы ограниченный набор полей, указанный в некоторой проекции



List<ProductDto> findDtosByName(String name); //выбираем из базы ограниченный набор полей, указанный в некоторой DTO

}





Чтобы решить эту проблему можно прибегнуть к использованию Dynamic Projection:





public interface ProductRepository extends JpaRepository<Product, Long> {

<T> List<T> findByName(String name, Class<T> type);

}





Подробнее о сценариях использования и компромиссах, на которые придется пойти используя Dynamic Projection, читайте в следующей статье: https://maciejwalkowiak.com/blog/spring-data-jpa-dynamic-projections/