Blaze Persistence实体视图继承映射
Blaze Persistence框架可以使用实体视图(EntityView)来执行复杂查询,从而避免了使用JPA实体的JOIN。在实体视图中,可以使用继承来创建一个视图层次结构,以便在查询中使用。
为了使用实体视图继承映射,我们可以使用@Mapping接口注释来定义映射关系。我们可以在@Mapping注释中指定不同的源实体类型和目标实体视图类型,以便在继承层次结构中映射各个实体。
例如,假设我们有一个简单的实体Person,以及它的子类Employee和Customer。我们可以为每个实体定义一个相应的视图类型,并使用@Mapping注释来定义映射关系。以下是示例代码:
@Entity public abstract class Person { @Id private Long id;
private String name;
}
@EntityView(Person.class) @Inheritance public interface PersonView { Long getId(); String getName(); }
@EntityView(Employee.class) public interface EmployeeView extends PersonView { String getJobTitle(); }
@EntityView(Customer.class) public interface CustomerView extends PersonView { String getCustomerType(); }
@Mapping(entity = Person.class, view = PersonView.class) @Mapping(entity = Employee.class, view = EmployeeView.class) @Mapping(entity = Customer.class, view = CustomerView.class) public interface MyMappingConfiguration {}
现在,我们可以使用实体视图和继承映射来执行以下查询:
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery
Root
query.select(cb.construct(EmployeeView.class, personJoin.get(Person_.id), personJoin.get(Person_.name), employeeRoot.get(Employee_.jobTitle)));
List
查询将返回一个包含所有Employee的EmployeeView列表,其中包含每个Person的通用属性和每个Employee的特定属性(例如,职业头衔)。