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

新手上路,请多包涵

我有一个使用休眠映射到 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 的数据库如下所示:

数据库

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

原文由 kovac 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 990
2 个回答

解决方案

PostgreSQL 中,您必须像这样指定架构名称:

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

很长的故事

你得到这个错误:

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

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


良好做法

  1. Don’t use Upper letters in the name of database , schema , tables or columns in PostgreSQL .否则你应该用引号来转义这个名字,这会导致语法错误,所以你可以使用:
 @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

原文由 Youcef Laidani 发布,翻译遵循 CC BY-SA 4.0 许可协议

对于出现此异常的人,在 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 所说 ,不要在表名或列名中使用大写字母,否则会出现此异常。

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

原文由 Vikash Kumar 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题