使用 Data Repositories

Spring Data repositories 为实体操作提供了非常有用的抽象,特别是实现业务逻辑的时候。

Jmix data repositories 基于 Spring Data 构建,但是在底层使用的是 DataManager。这样既可以使用方便的 repository 接口,又能支持 Jmix 中的高级数据访问功能,比如 实体事件跨数据存储实体引用数据访问权限检查 等。

目前在 1.6 版本中,Jmix data repositories API 仍然是实验性的。在下一个功能版本中有一些小的改动,进一步完善并稳定。

使用 Data Repositories

  1. 创建一个接口,继承自 JmixDataRepository。使用实体类和实体 ID 类作为 JmixDataRepository 的参数。示例:

    public interface CustomerRepository extends JmixDataRepository<Customer, UUID> {
    }
  2. 在 Jmix 主程序类或者扩展组件的配置类上添加 @EnableJmixDataRepositories 注解:

    @SpringBootApplication
    @EnableJmixDataRepositories
    public class SampleDataAccessApplication {

    Jmix 会初始化应用程序和扩展组件基础包内的所有 data repositories。如果需要对搜索和初始化 repositories 做进一步自定义,可以使用注解的 basePackagesexcludeFiltersincludeFilters 属性配置。

  3. 在 Spring bean 或 UI 控制器内使用 @Autowired 注解注入 repository:

    @Autowired
    private CustomerRepository customerRepository;

JmixDataRepository 的功能

JmixDataRepository 接口派生自标准的 Spring Data PagingAndSortingRepository。此外,提供了一些 Jmix 特有的方法:

  • 数据加载方法支持 fetch plan,比如 findById()findAll()

  • create() 方法 初始化 一个新实体。

  • 返回非 Optional 对象的 getById() 方法会在找不到实体时抛出异常。

可以使用下列注解自定义查询方法:

  • @io.jmix.core.repository.Query 定义 JPQL 查询语句,与 Spring Data JPA 的 @Query 注解类似。

  • @io.jmix.core.repository.FetchPlan 定义加载数据时使用的 fetch plan。

方法示例

Jmix data repositories 支持从方法名生成查询语句的 Spring Data 标准功能,示例:

List<Customer> findByEmailContainingIgnoreCase(String emailPart);

与 Spring Data JPA 类似,可以使用 @io.jmix.core.repository.Query 注解显式定义 JPQL 语句:

@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);

查询方法还支持一个特殊的 fetch plan 参数:

List<Customer> findByEmailContainingIgnoreCase(String emailPart, FetchPlan fetchPlan);

共享的 fetch plan 可以在查询方法的 @io.jmix.core.repository.FetchPlan 注解中定义:

@FetchPlan("customer-minimal")
List<Customer> findByEmail(String email);