子类属性上的JPA Criteria API和OrderBy

时间:2013-07-17 10:25:49

标签: java-ee jpa criteria-api subclass

我有一个 AbstractPerson 作为两个子类: LegalPerson PhysicalPerson

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public abstract class AbstractPerson {
    private Long id;
    ...
}

@Entity
public class LegalPerson extends AbstractPerson {
    private String name;
    ...
}

@Entity
public class PhysicalPerson extends AbstractPerson {
    private String lastName;
    private String firstName;
    ...
}

当我检索所有实体时(基于AbstractPerson的CriteriaQuery)我会通过LegalPerson.name ASC,PhysicalPerson.lastName ASC,PhysicalPerson.firstName ASC 订购它们。

我需要生成一个按这些标准排序和分组的抽象实体列表。 原始SQL查询允许出现所有子类字段(SINGLE_TABLE策略),但我不知道如何利用它们。

是否有任何解决方案使用Criteria API在子类属性上排序查询结果?

谢谢, 最好的祝福, 塞特。

2 个答案:

答案 0 :(得分:1)

Criteira API定义了一个as()API,允许您转换为另一个类。这应该适用于我认为的子类,至少应该使用EclipseLink。

如果它们都有名称,您应该考虑将名称移到超类中。通过仅在子类中的字段进行排序将给出奇数顺序,因为您将首先获得所有LegalPersons然后获得所有PhysicalPersons。

答案 1 :(得分:0)

我花了几天时间在JPA标准中努力解决多态问题。我得出的结论是,在涉及多态查询时,jpa标准没有任何帮助。

您可以实现的最好的方法是通过相当复杂的exists-subquery-construction对子类的属性进行限制。

我的提示是:如果可以,请避免使用标准。

如果你有一个静态查询,也许你对JPQL更幸运。