错误:“用户”处或附近的语法错误
Posted
技术标签:
【中文标题】错误:“用户”处或附近的语法错误【英文标题】:ERROR: syntax error at or near "user" 【发布时间】:2012-02-20 14:24:20 【问题描述】:我正在使用 Hibernate,并且有一个名为“User”的持久类。由于这是一个关键字,我用不同的名称标记了@Entity 属性(例如,我见过这个问题: Unable to use table named "user" in postgresql hibernate)
但是,我仍然遇到了麻烦,因为这个类扩展了另一个,而且看起来 hibernate 仍在尝试使用“用户”作为列名并且搞砸了:
@Entity( name = "XonamiUser" )
public class User extends PropertyContainer
...
和
@MappedSuperclass
public abstract class PropertyContainer implements Serializable
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected long key;
/** tags */
@ElementCollection
protected Set<String> tags;
@ElementCollection
protected Set<String> searchList;
...
我的其他扩展 PropertyContainer 的类似乎工作正常。
这是休眠中的错误吗?有没有办法绕过这个重构?谢谢!
这是我看到的错误(稍微清理一下):
WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 0, SQLState: 42601
ERROR org.hibernate.util.JDBCExceptionReporter - Batch entry 0 insert into user_search_list (user, search_list) values ('1', 'bjorn') was aborted. Call getNextException to see the cause.
WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 0, SQLState: 42601
ERROR org.hibernate.util.JDBCExceptionReporter - ERROR: syntax error at or near "user"
Position: 31
【问题讨论】:
@TJ,我添加了导致我相信它仍在使用列名的错误。 【参考方案1】:user
是 PostgreSQL 中的 reserved keyword。只允许使用quoted identifier。
您必须强制 Hibernate 在此 INSERT 命令中使用带引号的 "user"
。
我不是 Hibernate 专家,但也许这个 Hibernate saving User model to Postgres 会有所帮助?
【讨论】:
是的,我在原始帖子中链接到的问题表达了同样的观点。这就是我使用 @Entity(name = "XonamiUser") 注释的原因。 我的错误类似于 ERROR: syntax error at or near。 Hibernate 为保留字覆盖 Postgresql 的实际错误。我花了一段时间才弄明白。 @BjornRoche 我认为这个问题与你的问题相似。你能帮我解决这个问题吗...***.com/questions/42224949/… 我在@column(name="\"user\"")
修复的实体内部遇到了这个问题【参考方案2】:
我有点困惑,你指的是名为 User 的列或表...你可以使用 @Table-annotation 为 JPA 中的实体设置表名:
@Entity
@Table(name = "XonamiUser")
public class User extends PropertyContainer
【讨论】:
我得到“不成功:创建表 user_search_list(用户 int8 不为 null,search_list varchar(255))... 错误 org.hibernate.tool.hbm2ddl.SchemaUpdate - 错误:在或附近出现语法错误”用户”【参考方案3】:最后,我将类用户重构为 XonamiUser。这不是我想要的,但效果很好。
【讨论】:
【参考方案4】:Hibernate reference manual 有一个示例显示如何定义用于保存集合元素的表名。它碰巧使用了一个用户实体来执行此操作,并将列定义为user_id
而不是用户。
对于您的情况,此映射应该没问题:
@ElementCollection
@CollectionTable(name = "user_search_list",
joinColumns = @JoinColumn(name = "user_id"))
@Column(name = "search_list")
protected Set<String> searchList;
【讨论】:
这假定 User 是唯一一个继承 PropertyContainer 的类,不是吗? 没有。 Hibernate 将连接列命名为“user”,因为它连接到一个名为“User”的实体。 但是searchList属于PropertyContainer,所以User和其他类都继承了它。如果我告诉 hibernate 它应该使用名称 user_search_list,那么它不会尝试为所有继承的类使用该名称吗?以上是关于错误:“用户”处或附近的语法错误的主要内容,如果未能解决你的问题,请参考以下文章