【问题标题】:Named query on a Mapped Superclass映射超类的命名查询
【发布时间】: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 创建了 abstractVoipCall 的实例,这违反了 abstract 关键字的规则。
  • 我删除了摘要,但仍然获得相同的异常。
  • 我猜你是对的!但我仍然不确定在映射类上执行 NamedQuery!可能您需要对子类执行命名查询,这反过来也会获取 MappedSuperClass 的所有数据!这似乎是解决问题的方法!
  • 问题是当我在 tomcat 中部署 web 应用程序时,它给了我这个异常。这似乎是它不喜欢的命名查询的声明。
  • 这是因为所有命名查询都是在应用程序启动时编译的!阅读此answer 了解详细信息!

标签: java database jpa notation


【解决方案1】:

@MappedSuperClass 中添加@NameQuery 注释非常好。在过去,Hibernate 曾经有过问题HHH-4364,这导致此失败。多年来,问题已得到解决。

另一方面,查询本身不会起作用,因为无法查询映射的超类。在 JPA 2.0 规范中,这是用以下词语来说明的:

与实体不同,映射的超类不可查询且不得 作为参数传递给 EntityManager 或 Query 操作。

这种限制是有道理的——映射超类的目的是在其他不相关的实体之间共享映射,映射超类不应该是实体继承层次结构的根。如果这样的查询有效,那纯粹是因为 JPA 供应商特定的扩展。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-04
    • 2021-06-13
    • 2010-10-14
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多