Java EclipseLink:对MappedSuperclass的查询失败

Java EclipseLink:对MappedSuperclass的查询失败,java,jpa,eclipselink,Java,Jpa,Eclipselink,我的应用程序是一个商店出售鱼类,水族馆等,我想得到一个名单中的前10名的项目,所有项目的基础上销售计数。我使用以下类: @MappedSuperclass @NamedQueries({ @NamedQuery(name="getTopItems",query="SELECT x FROM FishStoreItem x ORDER BY x.salescnt DESC, x.title DESC") }) public abstract class FishStoreItem

我的应用程序是一个商店出售鱼类,水族馆等,我想得到一个名单中的前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](日食 持久性服务- 2.0.0.v20091127-r5931):org.eclipse.persistence.exceptions.jpqleexception 异常说明:编译时出错 查询[getTopItems:从中选择x FishStoreItem x由x.salescnt订购 描述,x.标题描述]。未知实体 键入[FishStoreItem]

同样的代码在ApacheOpenJPA2.0.0上运行良好,但在EclipseLink版本2.1.0、2.0.1、1.0上运行失败


另外,我已经找到了Hibernate的解决方案,但我想确定EclipseLink也不可能做到这一点。

映射的超类不是实体,不允许查询、持久化或与超类的关系(请参阅)

这在Apache OpenJPA 2.0用户指南中得到了确认:

映射的超类是非实体 类,该类可以定义持久状态 和实体的映射信息 子类。映射的超类是 通常是抽象的。不像真的 实体,则无法查询映射的实体 超类,传递映射的超类 任何
实体管理器的实例
或 查询方法,或声明持久 与映射超类的关系 目标。表示映射的超类 使用
MappedSuperclass
标记 注释

注意

OpenJPA允许您查询映射的 超级类。对映射对象的查询 超类将返回所有匹配的 子类实例。OpenJPA也 允许您声明与的关系 映射超类类型;然而,你 无法跨这些关系进行查询


因此,虽然OpenJPA允许您进行查询,但这超出了JPA的范围。不要期望它能与任何JPA提供者一起工作。

作为JPA实现,该代码也能很好地工作。能够查询映射超类的实例,同时又超出了JPA规范,这是一个非常合理的要求,我们相信可以提供这样的功能。毕竟持久性提供程序知道映射的超类中有哪些子类,所以不允许用户使用这样的工具是没有意义的。

您能确认您只是想为每个实体子类运行一个单独的查询,并将结果聚合在一起吗

这类似于按类查询表

过去我为EclipseLink构建了一个扩展,可以处理此类查询,如果社区感兴趣,我们可以研究将其添加到项目中,并确定需求


道格

情况仍然如此吗?我今天遇到了这个问题,使用的是datanucleus-accessplatform-full-deps-3.1.4版本。当尝试使用@MappedSuperclass类执行criteriaquery时,我得到了“类型不是已知的实体类型”。它确实得到了增强,但我无法查询基本映射的超类类型。我从openjpa转换过来,遇到了这个问题。在代码datanucleus代码库中是否有此方面的单元测试,我可以将其用作参考。我们对此类功能进行了单元测试。那时他工作。现在工作了。未来的工作