错误:“用户”处或附近的语法错误

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,那么它不会尝试为所有继承的类使用该名称吗?

以上是关于错误:“用户”处或附近的语法错误的主要内容,如果未能解决你的问题,请参考以下文章

Postgresql:“-”处或附近的语法错误

Npgsql Exception-“\”处或附近的语法错误

postgresql 错误:“返回”处或附近的语法错误

java - PSQLException:错误:“$ 1”处或附近的语法错误[重复]

错误:“修改”处或附近的语法错误 - 在 postgres

在“PARALLEL”处或附近创建 postgis 扩展语法错误