使用 Data Repositories

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

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

使用 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);