【问题标题】:Reference subclass properties in criteria API在标准 API 中引用子类属性
【发布时间】:2013-12-22 11:09:54
【问题描述】:

我正在尝试在超类上构建查询,并且可以选择引用子类的属性(如果对象是该子类的实例)。

EclipseLink wiki 说我应该使用 superClassRoot.as(Subclass.class).get("subclassField"),但它会引发异常:属性 ... 来自托管类型 ...[DatabaseTable(SUPER_CLASS)]不存在。类映射为@Inheritance(strategy = InheritanceType.JOINED),因此子类有自己的表。

我的期望是 EL 会为子表创建一个外连接,并有选择地引用这些连接的列。

【问题讨论】:

  • 认为这与stackoverflow.com/questions/6903783/… 相同(不幸的是没有正确答案)
  • 为什么不直接检索根实体?子类的实例也将被返回,这些实例将具有所需的属性。即“从 BaseEntity b where..中选择 b”将返回 BaseEntity 及其所有子类的实例。这比“Select b.name, c.something, d.somethingElse from..”简单得多,它不会按照您期望/想要的方式工作。这是可能的,但会涉及额外的看似不必要的表连接,因为 JPQL 是围绕对象而不是表设计的。
  • 我选择单个字段是因为我选择的是不同的实体,有点像平面表映射的类层次结构(以及一些连接的类)。

标签: jpa eclipselink criteria


【解决方案1】:

我会使用两个不同的查询,然后简单地合并结果:

  1. 第一个获取超类(而不是子类)的实例
  2. 子类的第二个获取实例(带有您的附加条件)。

如果这不是您的应用程序的一个非常重要的部分,那么这将是完美的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    相关资源
    最近更新 更多