java – JPA 2.0 CriteriaQuery,类型上的谓词是类或任何子类

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

@Entity
Class Ticket {

    @ManyToOne(optional = true)
    private Customer customer;    

}

@Entity
Class Customer {}

@Entity
Class Person extends Customer {}

@Class CustomPerson extends Person {}

如何查询具有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类.例如“从Person p中选择t,在t.customer = p中选择票证t”

JPA 2.1引入了“处理”,允许您对实体进行向下转换和操作,就好像它是某个类一样.由于任何子类也是一个实例,因此它会根据您的需要进行过滤. 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,类型上的谓词是类或任何子类 - 代码日志