【问题标题】:Querying Mapped Superclasses or Equivalent查询映射的超类或等价物
【发布时间】:2014-06-04 08:27:28
【问题描述】:

我有三个类是抽象超类汽车的子类。我正在为汽车类使用单表继承模型和@MappedSuperclass。子类是 Car、Truck 和 Van。

我想查询汽车类,但返回了不同的子类。我已经写了几个查询并进行了一些研究,但似乎无法针对 MappedSuperclasses 进行查询。我也尝试过 NativeSqlQueries,但我似乎无法弄清楚如何指定多个 ResultSetMappings。

有没有办法做到这一点?

【问题讨论】:

  • 请显示您的查询和映射,可能是某个地方出现了一个小错误,导致您无法获得正确的行为。
  • 我想要的查询是 SELECT a FROM Automobile a WHERE a.year
  • 一些 JPA 实现允许查询映射的超类,但正如答案所说,规范不需要它。也许你的 JPA 实现不是那么灵活
  • 我使用的是 eclipselink 2.5。我了解到它不允许查询映射的超类,但它允许查询常规实体超类。我最终从 TABLE_PER_CLASS 继承模型切换到了 JOINED 模型。现在我可以查询超类了。

标签: java jakarta-ee inheritance jpa jpql


【解决方案1】:

您不能在查询中使用映射超类。如果要在查询中使用Automobile,请不要将其标记为映射超类,而是将其标记为实体。

以下来自JPA 2.0 Spec,第二段与您的情况相关-

2.11.2 映射的超类

实体可以从提供持久实体状态和映射信息的超类继承,但它本身不是实体。通常,此类映射超类的目的是定义多个实体类共有的状态和映射信息。

与实体不同,映射超类不可查询,并且不得作为参数传递给 EntityManager 或 Query 操作。 由映射超类定义的持久关系必须 是单向的。

【讨论】:

  • 就是把mappedsuperclass注解改成实体注解那么简单吗?
  • IMO,应该是按照规范说的。
猜你喜欢
  • 1970-01-01
  • 2014-04-18
  • 1970-01-01
  • 2021-11-11
  • 2015-12-20
  • 1970-01-01
  • 2011-04-17
  • 2013-08-11
  • 2012-05-18
相关资源
最近更新 更多