java - JPA 2.0 CriteriaQuery,其类型为类或任何子类的谓词

标签 java jakarta-ee eclipselink jpa-2.0

假设以下实体类和层次结构:

@Entity
Class Ticket {

    @ManyToOne(optional = true)
    private Customer customer;    

}

@Entity
Class Customer {}

@Entity
Class Person extends Customer {}

@Class CustomPerson extends Person {}

我如何查询所有包含 customer 类型为 Person 或 Person 的任何子类(即 CustomPerson)的工单?

我可以轻松地在类型上创建谓词:

Predicate p = criteriaBuilder.equal(Ticket_...type(), criteriaBuilder.literal(Person.class));

但这会过滤掉 CustomPerson

除非有通用方法来处理这个问题(在 JPA 2.0 中),否则如果我可以在运行时确定所有扩展 Person 的实体,我就可以解决这个问题;在这种情况下我可以使用

Predicate p = criteriaBuilder.in(Ticket_...type(), listOfPersonSubclasses);

最佳答案

JPA 2.0 不提供通用方法,因此您必须列出所有子类,或更改查询以使其基于您的 Person 类。例如 “Select t from Person p, ticket t where t.customer=p”

JPA 2.1 引入了“treat”,它允许您向下转换实体并对其进行操作,就好像它是某个类一样。由于任何子类也是一个实例,因此它会完全按照您的要求进行过滤。 https://wiki.eclipse.org/EclipseLink/Release/2.5/JPA21#Treat

您可以将它用作连接或在 where 子句中使用,但示例可能是:

"Select t from Ticket t join treat(t.customer as Person) p"

关于java - JPA 2.0 CriteriaQuery,其类型为类或任何子类的谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30732140/

相关文章:

java - 如何读取 Word 或 Txt 类型文件中字符串的 X 和 Y 坐标?

java.io.filenotfoundexception 尝试从不同文件写入现有文件

java - 使用 Maven 通过 swing 客户端构建 Java EE 6 项目

java - 如何在没有管理器的情况下使用apache HttpClient?

java - Foursquare Java API v2 - checkin 示例

java - 读取正在写入的文件 - 锁定它?

java - Spring MVC传入参数 @RequestParam String requestURL

jpa - Eclipselink 延迟加载

jpa - 具有空值关系中目标实体的属性的 JPQL LIKE 表达式

java - 包含在 Set 上的 QueryDSL JPA 语法错误?