【问题标题】:JPA Criteria API and OrderBy on subclasses attributes子类属性上的 JPA Criteria API 和 OrderBy
【发布时间】:2013-07-17 10:25:48
【问题描述】:

我有一个 AbstractPerson,它有两个子类:LegalPersonPhysicalPerson

@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 对子类属性的查询结果进行排序的解决方案?

谢谢, 此致, 赛斯。

【问题讨论】:

    标签: jakarta-ee jpa criteria-api subclass


    【解决方案1】:

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

    如果它们都有名字,你应该考虑把名字移到超类中。按仅在子类中的字段排序会产生奇怪的顺序,因为您将首先获得所有 LegalPersons,然后是所有 PhysicalPersons。

    【讨论】:

    • 谢谢詹姆斯。我试过了,但它会导致无效的键表达式:Root<AbstractPerson> root = cq.from(AbstractPerson.class); ... cb.asc(((Path)root.as(LegalPerson.class)).get(LegalPerson_.name))
    【解决方案2】:

    我花了几天时间与 JPA 标准中的多态性作斗争。我得出的结论是,在涉及多态查询时,jpa 标准没有帮助。

    你能做到的最好的事情是通过相当复杂的存在子查询构造来限制子类的属性。

    我的建议是:尽可能避免使用标准。

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

    【讨论】:

    • 尼尔斯你好,这似乎是真的。 Criteria 是强类型的,它不应该允许这种类型的向下转换。同时,我在抽象类中使用了 PrePersist 和 PreUpdate 索引字段。所以,我希望有一个 JPA 2.0 Criteria 解决方案(例如 JPA 2.1 处理)。谢谢。
    猜你喜欢
    • 2011-10-17
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    • 2015-02-15
    相关资源
    最近更新 更多