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供应商特定的扩展。