我试图在映射的超类上声明 NamedQuery,但收到此错误:
org.hibernate.hql.ast.QuerySyntaxException:VoipCall 未映射 [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 中我发现了这个:
NamedQuery 注释可以应用于实体或映射的超类。
我哪里错了?
Thanks!!
解决方案:对我来说,解决方案是一种解决方法:我将命名查询移动到子类上,并适当地更改了 where 子句。从我的角度来看,这降低了代码的可维护性,但我无法以其他方式做到这一点。
拥有它就完美了@NameQuery
中的注释@MappedSuperClass
。过去 Hibernate 曾经遇到过问题HHH-4364,这导致此操作失败。问题多年来一直得到解决。
另一方面,查询本身预计不起作用,因为无法查询映射的超类。在 JPA 2.0 规范中,这是用以下文字来说明的:
映射的超类与实体不同,是不可查询的,并且不能
作为参数传递给 EntityManager 或查询操作。
这种限制是有道理的 - 映射超类的目的是在其他不相关的实体之间共享映射,映射超类不应该是实体继承层次结构的根。如果这样的查询有效,那纯粹是因为 JPA 供应商特定的扩展。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)