org.postgresql.util.PSQLException: ERROR: column user0_.id 不存在 - Hibernate

2022-09-01 02:30:10

我有一个模型类,它使用休眠映射到postgres数据库。我的模型类是:

@Entity
@Table(name="USER")
public class User {

    @Id 
    @GeneratedValue
    @Column(name="id")
    private long id;

    @Column(name="username", unique=true)
    private String username;

    @Column(name="email")
    private String email;

    @Column(name="created")
    private Timestamp created;

    public User(long id, String username, String email) {
        this.id = id;
        this.username = username;
        this.email = email;
    }
}

我尝试使用以下查询检索用户名为“adam”的用户:

tx = session.beginTransaction();
TypedQuery<User> query = session.createQuery("FROM User u WHERE u.username = :username", User.class).setParameter("username", "adam");
user = query.getSingleResult();

我得到一个例外,上面写着:

org.postgresql.util.PSQLException: ERROR: column user0_.id does not exist

我的数据库来自 bash shell 看起来像这样:

database

休眠如何将类属性映射到表列?它是基于唯一匹配,还是也尝试基于数据类型和约束(如唯一/自动增量)进行匹配?@Column(name="username")


答案 1

溶液

PostgreSQL中,您必须指定架构的名称,如下所示:

@Table(name="table_name", schema = "myapp")
                          ^^^^^^^^^^^^^^^^

说来话长

你得到这个错误:

org.postgresql.util.PSQLException: ERROR: column user0_.id does not exist

因为当你在PostgreSQL中创建一个数据库时,它会创建一个名为public的默认模式,所以当你没有在中指定名称时,Hibernate会自动检查公共模式。Entity


良好做法

  1. 不要在 、 或 PostgreSQL 的名称中使用大写字母。否则,您应该用引号转义此名称,这可能会导致语法错误,因此您可以使用:databaseschematablescolumns

@Table(name="table_name", schema = "schema_name")
             ^^^^^^^^^^             ^^^^^^^^^^^
  1. 关键字 USERPostgreSQL 中的保留关键字,看看

+----------+-----------+----------+-----------+---------+
| Key Word |PostgreSQL |SQL:2003  | SQL:1999  | SQL-92  |
+----------+-----------+----------+-----------+---------+
|  ....        ....       ....       ....       ....    |
+----------+-----------+----------+-----------+---------+
| USER     |  reserved |reserved  | reserved  | reserved|
+----------+-----------+----------+-----------+---------+
  1. 为了区分DtoEntity,例如,在实体名称的末尾使用Entity的良好做法UserEntity

答案 2

对于得到这个异常的人,在postgres中,每当你编写一个实体类时,尝试将其与正确的架构(你的表所在的位置)相关联,如下所示:

@Entity
@Table(name = "user", schema = "users_details")
public class User implements Serializable{

    @Column(name = "id")
    Long id;    //long is not recommended

   // Other data
}

正如@YCF_L所说,不要在表名或列名中使用Upper_case字母,否则你会得到这个例外。

当存在必须从实体类自动生成表的情况时,此约定变得更加重要,反之亦然。


推荐