1

我正在尝试在映射的超类上声明 NamedQuery,但我收到此错误:

org.hibernate.hql.ast.QuerySyntaxException:VoipCall 未映射 [从 VoipCall v 中选择 v,其中 v.audioFile = :audioFile]

我们使用休眠,但我们更喜欢使用 JPA 标准表示法。

这是代码:

@MappedSuperclass
@NamedQueries(value = {
    @NamedQuery(name = "getVoipCallsForAudio", query = "select v from VoipCall v where v.audioFile = :audioFile")
})
public abstract class VoipCall implements Serializable {

似乎我不能在查询中使用我的 mappedSuperClass,但我不明白为什么如果在 JPA API 中我发现了这个:

NamedQuery 注释可以应用于实体或映射的超类。

我哪里错了?

谢谢!!

解决方案: 对我来说,解决方案是一种解决方法:我将命名查询移动到子类上,适时地更改了 where 子句。从我的角度来看,这使我的代码可维护性降低,但我不能以其他方式做到这一点。

4

1 回答 1

3

@NameQuery@MappedSuperClass. _ 在过去,Hibernate 曾经有过问题HHH-4364,这导致它失败。问题多年来一直是固定的。

另一方面,查询本身不会起作用,因为无法查询映射的超类。在 JPA 2.0 规范中,这是用以下词语来说明的:

与实体不同,映射的超类是不可查询的,并且不能作为参数传递给 EntityManager 或 Query 操作。

这种限制是有道理的——映射超类的目的是在其他不相关的实体之间共享映射,映射超类不应该是实体继承层次结构的根。如果这样的查询有效,那纯粹是因为 JPA 供应商特定的扩展。

于 2013-05-07T18:56:43.353 回答