使用 Data Repositories
Spring Data repositories 为实体操作提供了非常有用的抽象,特别是实现业务逻辑的时候。
Jmix data repositories 基于 Spring Data 构建,但是在底层使用的是 DataManager。这样既可以使用方便的 repository 接口,又能支持 Jmix 中的高级数据访问功能,比如 实体事件,跨数据存储实体引用,数据访问权限检查 等。
目前在 1.6 版本中,Jmix data repositories API 仍然是实验性的。在下一个功能版本中有一些小的改动,进一步完善并稳定。 |
使用 Data Repositories
-
创建一个接口,继承自
JmixDataRepository
。使用实体类和实体 ID 类作为JmixDataRepository
的参数。示例:public interface CustomerRepository extends JmixDataRepository<Customer, UUID> { }
-
在 Jmix 主程序类或者扩展组件的配置类上添加
@EnableJmixDataRepositories
注解:@SpringBootApplication @EnableJmixDataRepositories public class SampleDataAccessApplication {
Jmix 会初始化应用程序和扩展组件基础包内的所有 data repositories。如果需要对搜索和初始化 repositories 做进一步自定义,可以使用注解的
basePackages
、excludeFilters
和includeFilters
属性配置。 -
在 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);