我试图在映射的父类(super class)上声明一个 NamedQuery,但我得到了这个错误:
org.hibernate.hql.ast.QuerySyntaxException: VoipCall is not mapped [select v from VoipCall v where 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 中我发现了这个:
The NamedQuery annotation can be applied to an entity or mapped superclass.
我哪里错了?
谢谢!!
解决方案: 对我来说,解决方案是一种变通方法:我在子类上移动了命名查询,并适时更改了 where 子句。从我的角度来看,这降低了代码的可维护性,但我不能以其他方式做到这一点。
最佳答案
在@MappedSuperClass
中使用@NameQuery
注释是完全没问题的。过去 Hibernate 曾经有问题 HHH-4364 ,这导致失败。问题已修复多年。
另一方面,查询本身预计不会工作,因为无法查询映射的父类(super class)。在 JPA 2.0 规范中,这是用下面的话来说明的:
A mapped superclass, unlike an entity, is not queryable and must not be passed as an argument to EntityManager or Query operations.
这种限制是有道理的——映射父类(super class)的目的是在其他不相关的实体之间共享映射,映射父类(super class)不应该是实体继承层次结构的根。如果这样的查询有效,那纯粹是因为 JPA 供应商特定的扩展。
关于java - 映射父类(super class)上的命名查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16396489/