java - JPA Criteria 使用单表继承查询实体层次结构

标签 java jpa criteria-api

假设我有以下实体:

@Entity
@Inheritance(strategy = SINGLE_TABLE)
@DiscriminatorColumn(name = "type")
public abstract class BaseEntity { 
    private Date someDate;
    private Date otherDate;
    private boolean flag;
}

@Entity
@DiscriminatorValue("entity1")
public class Entity1 extends BaseEntity { 
    private String someProperty;
}

@Entity
@DiscriminatorValue("entity2")
public class Entity2 extends BaseEntity { 
    private String otherProperty;
}

我正在尝试构建一个条件查询,它根据 BaseEntity 和两个子类中的属性返回 BaseEntity 的实例。所以基本上我正在寻找一个与这个伪 SQL 相对应的条件查询:

SELECT * FROM <BaseEntity table name>
WHERE someDate < ? AND otherDate > ? AND flag = ?
AND someProperty = ? AND otherProperty = ?;

我不想构建两个单独的查询,因为它们有太多重叠(即大部分属性都在基类中)。但是,如果我将 BaseEntity 声明为根,我还没有找到在查询中引用子类属性的方法。是否可以构建这样的条件查询?

更新:

也许一些代码可以澄清这个问题。我基本上想做这样的事情:

CriteriaBuilder builder = ...;
CriteriaQuery<BaseEntity> query = ...;
Root<BaseEntity> root = ...;

query.select(root).where(builder.and(
        builder.lessThan(root.get(BaseEntity_.someDate), new Date()),
        builder.greaterThan(root.get(BaseEntity_.otherDate), new Date()),
        builder.isTrue(root.get(BaseEntity_.flag)),
        builder.equal(root.get(Entity1_.someProperty), "foo"),   <-- This won't work
        builder.equal(root.get(Entity2_.otherProperty), "bar")   <-- Neither will this
));

现在,我明白为什么上面的代码示例不起作用,但我想知道是否有办法绕过它。

最佳答案

我设法通过将 BaseEntity 根向下转换为与子类类型对应的新根来解决这个问题 CriteriaBuilder.treat()像这样:

CriteriaBuilder builder = ...;
CriteriaQuery<BaseEntity> query = ...;
Root<BaseEntity> root = ...;
Root<Entity1> entity1 = builder.treat(root, Entity1.class);
Root<Entity2> entity2 = builder.treat(root, Entity2.class);

query.select(root).where(builder.and(
        builder.lessThan(root.get(BaseEntity_.someDate), new Date()),
        builder.greaterThan(root.get(BaseEntity_.otherDate), new Date()),
        builder.isTrue(root.get(BaseEntity_.flag)),
        builder.equal(entity1.get(Entity1_.someProperty), "foo"),
        builder.equal(entity2.get(Entity2_.otherProperty), "bar")
));

关于java - JPA Criteria 使用单表继承查询实体层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25624768/

相关文章:

java - 使用 xml 中的另一个属性值检索一个属性值

Java 代理设置

java - jersey-spring 版本,带有 spring 4.2.5

java - 在 EntityManager 删除同步期间找到的对象之后

java - 静态元模型、jpa 和字段名称作为字符串

java - Criteria Builder 中的 Join 中的 getOn 不起作用

hibernate - 在 JPA 条件查询的 'case...when...then...else...end' 子句中使用 'having' 构造

java - 用户首选的对比极性? (操作系统暗模式设置)

jpa - 如何在 JPA CriteriaQuery select 子句中选择 0

Java,单个数据库列多次引用