【发布时间】:2013-05-06 10:11:58
【问题描述】:
我正在尝试在映射的超类上声明 NamedQuery,但我收到此错误:
org.hibernate.hql.ast.QuerySyntaxException: VoipCall 未映射 [从 VoipCall v 中选择 v,其中 v.audioFile = :audioFile]
我们使用休眠,但我们更喜欢使用 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 子句。从我的角度来看,这使我的代码可维护性降低,但我不能以其他方式做到这一点。
【问题讨论】:
-
我认为是因为
abstract。 AFAIK,无法实例化抽象类,并且您提供的NamedQuery创建了abstract类VoipCall的实例,这违反了abstract关键字的规则。 -
我删除了摘要,但仍然获得相同的异常。
-
我猜你是对的!但我仍然不确定在映射类上执行 NamedQuery!可能您需要对子类执行命名查询,这反过来也会获取 MappedSuperClass 的所有数据!这似乎是解决问题的方法!
-
问题是当我在 tomcat 中部署 web 应用程序时,它给了我这个异常。这似乎是它不喜欢的命名查询的声明。
-
这是因为所有命名查询都是在应用程序启动时编译的!阅读此answer 了解详细信息!
标签: java database jpa notation