Hibernate注释生成生成SQLGrammarException的查询

Hibernate注释生成生成SQLGrammarException的查询,hibernate,exception,annotations,Hibernate,Exception,Annotations,还在和Hibernate打交道 我对bean使用Hibernate注释而不是hbm.xml文件,但我目前遇到了一个问题,Hibernate生成的SQL引用不存在数据库列 例如,下面是代码: Query q = session.createQuery("FROM Status ORDER BY post_date DESC"); (它正在检索一个状态对象列表,从最近到最不最近排序,每个状态对象都包含自己的评论对象列表……是的,想想Facebook的帖子) 下面是它生成的查询: Hibernate

还在和Hibernate打交道

我对bean使用Hibernate注释而不是hbm.xml文件,但我目前遇到了一个问题,Hibernate生成的SQL引用不存在数据库列

例如,下面是代码:

Query q = session.createQuery("FROM Status ORDER BY post_date DESC");
(它正在检索一个
状态
对象列表,从最近到最不最近排序,每个
状态
对象都包含自己的
评论
对象列表……是的,想想Facebook的帖子)

下面是它生成的查询:

Hibernate: select status0_.pid as pid1_, status0_.content as content1_, status0_.owner_uid as owner5_1_, status0_.parent_pid as parent6_1_, status0_.post_date as post4_1_, status0_.type as type1_ from POSTS status0_ order by post_date DESC limit ?
问题是,在该查询中,它引用了
status0\uu.owner\u uid
status0\uu.parent\u pid
,但这些字段在数据库中不存在。当我手动更改查询以分别使用
status0\uu0.owner
status0\u0.parent
并将其提供给MySQL时,它工作得非常好

涉及到四门课

用户
,不了解系统中的任何其他内容(以下相关字段):

一个
Post
,一个抽象超类,用于存储在同一个表中并通过列
类型
区分的
注释
状态
(以下相关字段):

A
Status
类,子类化
Post
;将
parent
设置为null,并包含
注释的列表(以下相关字段):

总之:我不知道为什么Hibernate将嵌入类的ID附加到查询中,从而导致一个不存在的列。理想情况下,我希望向这些字段添加
@列(name=“parent”)
注释,但Hibernate似乎不允许对标记为
@manytone
的字段添加此特定注释

感谢您的帮助!谢谢大家!


编辑:仅供参考,如果我手动更改数据库中的列以匹配Hibernate生成的内容,则会出现另一个错误:
无法实例化抽象类或接口:Post
。显然,我的配置不正确:P

Hibernate对多通关联的默认命名策略采用您的字段名,并使用下划线将PK列追加到关联表中

因此,对于Post(状态超类),您将
owner\u uid
parent\u pid
作为列名,因为
uid
pid
是各自的PK列名

您可以通过使用@JoinColumn注释来覆盖此项:

@ManyToOne
@JoinColumn(name = "parent")
private Post parent;

@ManyToOne
@JoinColumn(name = "owner")
private User owner;
或者通过实现您自己的NamingStrategy(特定于Hibernate,不建议初学者使用:-))


另一方面,@Embedded表示您希望将给定的实体映射为组件(基本上是同一个表的一部分)。将@ManyToOne和@Embedded放在同一个属性上是(或应该是)非法的。

Hibernate对ManyToOne关联的默认命名策略采用您的字段名,并使用下划线追加关联表的PK列

因此,对于Post(状态超类),您将
owner\u uid
parent\u pid
作为列名,因为
uid
pid
是各自的PK列名

您可以通过使用@JoinColumn注释来覆盖此项:

@ManyToOne
@JoinColumn(name = "parent")
private Post parent;

@ManyToOne
@JoinColumn(name = "owner")
private User owner;
或者通过实现您自己的NamingStrategy(特定于Hibernate,不建议初学者使用:-))


另一方面,@Embedded表示您希望将给定的实体映射为组件(基本上是同一个表的一部分)。将@ManyToOne和@Embedded放在同一个属性上是(或应该是)非法的。

我应该在遇到Hibernate问题时开始向您发送消息:)问题已修复!再次感谢你!不用担心,这就是我挂在Hibernate标签上的原因:-)当我有一个Hibernate问题时,我应该开始给你发消息:)问题解决了!再次感谢你!不用担心,这就是为什么我挂在Hibernate标签上:-)
@Entity
@Table(name="POSTS")
@DiscriminatorValue("status")
public class Status extends Post {

    @OneToMany(mappedBy="parent")
    @OrderBy("postDate asc")
    private List<Comment> children; 
    ...
}
@Entity
@DiscriminatorValue("comment")
@Table(name="shannonq_posts")
public class Comment extends Post {
    // this class is literally empty
}
@ManyToOne
@JoinColumn(name = "parent")
private Post parent;

@ManyToOne
@JoinColumn(name = "owner")
private User owner;