Hibernate注释生成生成SQLGrammarException的查询
还在和Hibernate打交道 我对bean使用Hibernate注释而不是hbm.xml文件,但我目前遇到了一个问题,Hibernate生成的SQL引用不存在数据库列 例如,下面是代码: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
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
,一个抽象超类,用于存储在同一个表中并通过列类型
区分的注释
和状态
(以下相关字段):
AStatus
类,子类化Post
;将parent
设置为null,并包含注释的列表(以下相关字段):
总之:我不知道为什么Hibernate将嵌入类的ID附加到查询中,从而导致一个不存在的列。理想情况下,我希望向这些字段添加@列(name=“parent”)
注释,但Hibernate似乎不允许对标记为@manytone
的字段添加此特定注释
感谢您的帮助!谢谢大家!
编辑:仅供参考,如果我手动更改数据库中的列以匹配Hibernate生成的内容,则会出现另一个错误:无法实例化抽象类或接口:Post
。显然,我的配置不正确:PHibernate对多通关联的默认命名策略采用您的字段名,并使用下划线将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;