Mapped Superclass上的命名查询

我试图在映射的超类上声明一个NamedQuery,但是我得到了这个错误:

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

我们使用hibernate,但我们更喜欢使用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子句。 从我的观点来看,这给了我较少的代码可维护性,但我不能以另一种方式做。

@MappedSuperClass使用@NameQuery注释是完全@MappedSuperClass 。 过去Hibernate曾经发过HHH-4364问题,导致这种情况失败。 问题是多年来修复的。

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

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

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