我的应用程序是一个销售鱼类,水族馆等的商店。我想根据销售数量获得所有商品中的前10个商品列表。我使用以下课程:
@MappedSuperclass
@NamedQueries({
@NamedQuery(name="getTopItems",query="SELECT x FROM FishStoreItem x ORDER BY x.salescnt DESC, x.title DESC")
})
public abstract class FishStoreItem
extends DomainSuperClass implements Serializable {
......
}
问题出现在以下异常中:
异常[EclipseLink-8034](Eclipse 持久性服务 - 2.0.0.v20091127-r5931):org.eclipse.persistence.exceptions.JPQLException 异常说明:编译错误 查询[getTopItems:SELECT x FROM FishStoreItem x ORDER BY x.salescnt DESC,x.title DESC]。未知的实体 输入[FishStoreItem]。
相同的代码适用于Apache OpenJpa 2.0.0,但在EclipseLink ver 2.1.0,2.0.1,1.0中失败。
P.S。我已经为Hibernate找到了that解决方案,但我想确保EclipseLink也不可能。
答案 0 :(得分:6)
映射的超类不是实体,不允许查询,持久化或与超类关系(请参阅Mapped Superclasses)。
这在Apache OpenJPA 2.0用户指南中得到了证实:
1.3. Mapped Superclass
映射的超类是非实体 可以定义持久状态的类 和实体的映射信息 子类。映射的超类是 通常抽象。与真实不同 实体,你不能查询映射 超类,传递映射的超类 实例到任何
EntityManager
或 查询方法,或声明持久化 与映射的超类的关系 目标。您表示映射的超类 使用MappedSuperclass
标记 注解。...
注意强>
OpenJPA允许您查询映射 超。对映射的查询 超类将返回所有匹配 子类实例。 OpenJPA也 允许您声明关系 映射的超类类型;但是,你 无法查询这些关系。
因此,虽然OpenJPA允许您的查询,但这超出了JPA。不要指望它适用于任何JPA提供商。
答案 1 :(得分:2)
您能否确认您只想为每个实体子类运行单独的查询并将结果汇总在一起?
这类似于TABLE_PER_CLASS查询。
我过去为EclipseLink构建了一个可以处理此类查询的扩展程序,如果有社区兴趣,我们可以调查将其添加到项目中,我们可以确定需求。
道格
答案 2 :(得分:-1)
该代码也适用于DataNucleus作为JPA实现。能够查询映射的超类的实例,同时超出JPA规范,是一个非常合理的要求,我们相信提供这样的东西。在所有持久性提供程序知道该映射超类的哪些子类之后,因此不允许用户使用这样的工具是没有意义的。