【问题标题】:SQLGrammarException: could not execute statement (PostgreSQL + Hibernate)SQLGrammarException:无法执行语句(PostgreSQL + Hibernate)
【发布时间】:2014-12-28 11:22:05
【问题描述】:

我的数据库包含用户表,在用户类中具有相同的命名字段。

@Column注解还是有问题:Intellij IDEA强调列名。

数据库表

    CREATE TABLE "user"
(
  email character varying,
  login character varying NOT NULL,
  password character varying NOT NULL,
  name character varying NOT NULL,
  id_user numeric NOT NULL,
  CONSTRAINT user_pkey PRIMARY KEY (login, password, id_user),
  CONSTRAINT user_email_key UNIQUE (email)
)

为什么会出现这种语法异常??我有同名表

根本原因

org.postgresql.util.PSQLException: ERROR: syntax error at or near "User"
  Position: 13
    org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2198)
    org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1927)
    org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255)
    org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:561)
    org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:419)
    org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:365)
    org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:133)
    org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:58)
    org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3067)
    org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3509)
    org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:88)
    org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:377)
    org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:369)
    org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:286)
    org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:339)
    org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52)
    org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1234)
    org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:404)
    org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
    org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175)
    com.classes.UserDB.registerUser(UserDB.java:17)
    com.servlets.Registration.doPost(Registration.java:29)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:644)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

用户

package com.DB;

import javax.persistence.*;

@Entity
public class User {

    @Lob
    private String email;
    @Lob
    private String login;
    @Lob
    private String password;
    @Lob
    private String name;

    @Id
    @GeneratedValue
    private int id_user;

    public int getId_user() {
        return id_user;
    }

    public void setId_user(int id_user) {
        this.id_user = id_user;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public User getUserFromBase(){
        return this;
    }
}

如何解决?

【问题讨论】:

  • 可能是第 17 行 UserDB 附近的错误查询(语法错误)?
  • 我已经编辑过了。不,不起作用

标签: java hibernate intellij-idea


【解决方案1】:

user 是保留字,不能创建名为 user 的表。

尝试在@Entity 之后添加@Table(name="USER_TABLE") 以更改表名。

抱歉没有仔细阅读。看来你已经有一个名为“USER”的表。这就是oracle的问题

【讨论】:

  • 如果您仍想使用保留关键字,请使用反引号:@Table(name="`user`")
【解决方案2】:

“user”是 PostgreSQL 中的保留字,在表或列中使用保留字通常不是一个好主意。

如果您想省去很多麻烦,请使用其他名称。用户,用户帐户。 也会更改与表相同的类名。

把@Table(name="USERS")注解:

@Entity
@Table(name="users")
public class Users {

}

【讨论】:

    猜你喜欢
    • 2021-02-01
    • 2021-04-26
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    • 2016-02-17
    • 2013-06-28
    • 2016-03-28
    相关资源
    最近更新 更多