我正在尝试在映射的超类上声明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子句。从我的观点来看,这给了我较少的代码可维护性,但我不能以另一种方式做。
答案 0 :(得分:3)
在@NameQuery
中添加@MappedSuperClass
注释完全没问题。在过去,Hibernate曾经遇到问题HHH-4364,导致这种情况失败。问题是多年来确定的。
另一方面,查询本身不会起作用,因为无法查询映射的超类。在JPA 2.0规范中,用以下词语告知:
与实体不同,映射的超类不可查询,也不能查询 作为参数传递给EntityManager或Query操作。
这种限制有道理 - 映射超类的目的是共享其他非相关实体之间的映射,映射的超类不应该是实体继承层次结构的根。如果这样的查询有效,那纯粹是因为JPA供应商特定的扩展。