Mapped Superclass上的命名查询

时间:2013-05-06 10:11:58

标签: java database jpa notation

我正在尝试在映射的超类上声明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子句。从我的观点来看,这给了我较少的代码可维护性,但我不能以另一种方式做。

1 个答案:

答案 0 :(得分:3)

@NameQuery中添加@MappedSuperClass注释完全没问题。在过去,Hibernate曾经遇到问题HHH-4364,导致这种情况失败。问题是多年来确定的。

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

  

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

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