假设以下实体类和层次结构:
@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/