Репозитории данных
Репозитории данных Spring Data предоставляют полезную абстракцию для работы с сущностями, особенно для реализации бизнес-логики.
Репозитории данных Jmix построены на базе Spring Data, но внутри используют DataManager. Это позволяет использовать удобный интерфейс репозиториев и при этом иметь полную поддержку продвинутых возможностей доступа к данным Jmix, таких как события сущностей, ссылки между сущностями из разных хранилищ, проверки доступа к данным и т.п.
В текущей версии 2.1 API репозиториев данных Jmix помечен как экспериментальный. В следующем функциональном релизе в него могут быть внесены незначительные изменения и API станет стабильным. |
Работа с репозиториями данных
-
Создайте интерфейс, унаследованный от
JmixDataRepository
. Используйте класс сущности и класс идентификатора сущности в качестве параметров типаJmixDataRepository
. Например:public interface CustomerRepository extends JmixDataRepository<Customer, UUID> { }
-
Добавьте аннотацию
@EnableJmixDataRepositories
главному классу приложения или классу конфигурации дополнения:@SpringBootApplication @EnableJmixDataRepositories public class SampleDataAccessApplication {
Jmix проинициализирует все репозитории данных, расположенные внутри и ниже базового пакета приложения или дополнения. Если требуется более тонкая настройка поиска репозиториев, используйте атрибуты аннотации
basePackages
,excludeFilters
иincludeFilters
. -
Инжектируйте репозиторий в бины Spring или UI-контроллеры с помощью аннотации
@Autowired
:@Autowired private CustomerRepository customerRepository;
Особенности JmixDataRepository
Интерфейс JmixDataRepository
расширяет стандартный интейфейс PagingAndSortingRepository из Spring Data. Он предоставляет несколько собственных методов, учитывающих специфику Jmix:
Следующие аннотации можно использовать на кастомных методах запросов:
-
@io.jmix.core.repository.Query
задает строку JPQL аналогично аннотации@Query
в Spring Data JPA. -
@io.jmix.core.repository.FetchPlan
задает фетч-план для загрузки данных.
Примеры методов запросов
Репозитории данных Jmix поддерживают стандартную возможность Spring Data выводить запрос из имени метода, например:
List<Customer> findByEmailContainingIgnoreCase(String emailPart);
Аналогично Spring Data JPA, JPQL-запрос можно явно задать с помощью аннотации @io.jmix.core.repository.Query
:
@Query("select c from sample_Customer c where c.email like :email")
List<Customer> findCustomersByEmail(@Param("email") String emailPart);
Методы запросов могут принимать объект Pageable
для постраничной загрузки и сортировки:
Page<Customer> findByEmailContainingIgnoreCase(String emailPart, Pageable pageable);
Другой специально обрабатываемый параметр, который можно использовать в методах запросов - фетч-план:
List<Customer> findByEmailContainingIgnoreCase(String emailPart, FetchPlan fetchPlan);
Разделяемый фетч-план можно задавать по имени в аннотации @io.jmix.core.repository.FetchPlan
:
@FetchPlan("customer-minimal")
List<Customer> findByEmail(String email);