使用 JPA 规范过滤联合实体

问题描述 投票:0回答:1

考虑这个 java JPA 模型:

  @Entity
  @Table(name = "PARENT")
  @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
  public abstract class ParentEntity { }
  @Entity
  @Table(name = "PARENT_Child1")
  public abstract class Child1Entity extends ParentEntity  { }
  @Entity
  @Table(name = "PARENT_Child2")
  public abstract class Child2Entity extends ParentEntity { }
  @Entity
  @Table(name = "PARENT_Child3")
  public abstract class Child3Entity extends ParentEntity { }

来自 Spring Data JPA 存储库的调用,例如:

parentRepository.findAll(specification);

将生成此查询:

select parent.id, from (select id from PARENT union all select id 1 as clazz_ from PARENT_CHILD1 union all select id, 2 as clazz_ from PARENT_CHILD2 union all select id, 3 as clazz_ from PARENT_CHILD3) parent

这正是我所期望的。但我正在寻找一种方法将联合限制为仅某些子类型,例如仅 Child2Entity 和 Child1Entity 而不是 Child3Entity。 使用 JPA 规范可以吗?

在 JPA 中,我没有 union 关键字来编写普通的 hql 查询。

java sql hibernate jpa spring-data-jpa
1个回答
0
投票

要在 JPA 中使用 TABLE_PER_CLASS 继承策略时将 UNION 操作限制为特定子类型,您可以通过单独从每个表中进行选择,然后使用 IN 子句仅过滤所需的子类型来修改查询。

CriteriaBuilder cb =EntityManager.getCriteriaBuilder(); CriteriaQuery 查询 = cb.createQuery(ParentEntity.class);根 root = query.from(ParentEntity.class); List> 子类 = Arrays.asList(Child1Entity.class, Child2Entity.class); query.select(root) .where(root.type().in(子类));列表结果=entityManager.createQuery(query).getResultList();

© www.soinside.com 2019 - 2024. All rights reserved.