java - 映射父类(super class)上的命名查询

标签 java database jpa notation

我试图在映射的父类(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/

相关文章:

php - 如果数据库中的条目被删除,如何检查 PHP?

java - 使用嵌入对象覆盖外键列名称

java - JPA CriteriaQuery 查询每个实体的最新数据

java - 如何在属于同一容器 Activity 的两个 fragment 之间传递数据?

java - 我收到很多 select @@session.tx_read_only,有人会这样做吗?

java sql 插入时间戳 java.sql.SQLSyntaxErrorException

java - JPA - 自动重新加载 @OneToMany 依赖项

java - Spring 框架 : Map - Value Referencing to another Map

java - 覆盖 zuul 错误过滤器导致转发错误

java - Android:应用程序不断预填充 sqlite 数据库