EclipseLink:对MappedSuperclass的查询失败

时间:2010-07-05 08:54:13

标签: 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 
       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也不可能。

3 个答案:

答案 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规范,是一个非常合理的要求,我们相信提供这样的东西。在所有持久性提供程序知道该映射超类的哪些子类之后,因此不允许用户使用这样的工具是没有意义的。