org.postgresql.util.PSQLException:错误:列user0_.id不存在 - Hibernate

swd*_*don 21 java postgresql entity hibernate jpa

我有一个使用hibernate映射到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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

我得到一个例外,说:

org.postgresql.util.PSQLException: ERROR: column user0_.id does not exist
Run Code Online (Sandbox Code Playgroud)

我的bash shell数据库如下所示:

数据库

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

YCF*_*F_L 33

解释

它给你这个错误:

@Table(name="table_name", schema = "myapp")
                          ^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

因为当您创建数据库PostgreSQL时,它会创建一个名为的默认模式Entity,因此当您未在其中指定名称时database,它将在公共模式中自动检查,因为您会收到此错误.

另一件事确认架构名称是正确的,错误说:

org.postgresql.util.PSQLException: ERROR: column user0_.id does not exist
Run Code Online (Sandbox Code Playgroud)

并不是 :

@Table(name="table_name", schema = "schame_name")
             ^^^^^^^^^^             ^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

确认查询使用schema而不是真实tables


要解决此问题,您必须指定模式的名称,如下所示:

+----------+-----------+----------+-----------+---------+
| Key Word |PostgreSQL |SQL:2003  | SQL:1999  | SQL-92  |
+----------+-----------+----------+-----------+---------+
|  ....        ....       ....       ....       ....    |
+----------+-----------+----------+-----------+---------+
| USER     |  reserved |reserved  | reserved  | reserved|
+----------+-----------+----------+-----------+---------+
Run Code Online (Sandbox Code Playgroud)

忠告

不要在PostgreSQL中的表或列的名称中使用大写字母.

@Table(name="table_name", schema = "myapp")
                          ^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

用户名被保留在PostgreSQL的关键字TA一

  • 感谢您更新答案。我不能放置实际的架构,因为它包含一些业务信息。但是您的建议解决了这个问题:) (2认同)

Vik*_*mar 7

对于遇到此异常的人,在 postgres 中,每当您编写实体类时,请尝试将其与正确的架构(表所在的位置)关联起来,如下所示:

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

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

   // Other data
}
Run Code Online (Sandbox Code Playgroud)

正如 @YCF_L 所说,不要在表名或列名中使用大写字母,否则您将得到此异常。

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


小智 5

应在实体类上添加架构名称。对于此示例,当架构名称是公共的时

@Table(name = "user", schema = "public")
Run Code Online (Sandbox Code Playgroud)

请参阅下面的 PostgreSQL 管理视图

在此输入图像描述

有关 SpringBoot Java 和 Postgre SQL 连接的更多信息,请参阅此处: https://cmsoftwaretech.wordpress.com/2020/04/25/springboot-thymleaf-using-postgresql/