我有一个使用 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;
}
}
我尝试使用以下查询检索用户名为“adam”的用户:
tx = session.beginTransaction();
TypedQuery<User> query = session.createQuery("FROM User u WHERE u.username = :username", User.class).setParameter("username", "adam");
user = query.getSingleResult();
我得到一个异常(exception):
org.postgresql.util.PSQLException: ERROR: column user0_.id does not exist
我的 bash shell 数据库如下所示:
hibernate 如何将类属性映射到表列?它是仅基于 @Column(name="username")
进行匹配,还是还尝试基于数据类型和约束(例如唯一/自动增量)进行匹配?
最佳答案
解决方案
在 PostgreSQL 中,您必须像这样指定架构的名称:
@Table(name="table_name", schema = "myapp")
^^^^^^^^^^^^^^^^
长篇大论
你遇到了这个错误:
org.postgresql.util.PSQLException: ERROR: column user0_.id does not exist
因为当你在 PostgreSQL 中创建数据库时,它会创建一个名为 public 的默认架构,所以当你没有在 Entity< 中指定名称时
然后 Hibernate 会自动检查 public 架构。
良好做法
database
、schema
、tables
或columns
的名称中不要使用大写字母<强>PostgreSQL。否则,您应该使用引号转义此名称,这可能会导致语法错误,因此您可以使用:
@Table(name="table_name", schema = "schema_name")
^^^^^^^^^^ ^^^^^^^^^^^
- 关键字USER是PostgreSQL中的保留关键字take a look at
+----------+-----------+----------+-----------+---------+
| Key Word |PostgreSQL |SQL:2003 | SQL:1999 | SQL-92 |
+----------+-----------+----------+-----------+---------+
| .... .... .... .... .... |
+----------+-----------+----------+-----------+---------+
| USER | reserved |reserved | reserved | reserved|
+----------+-----------+----------+-----------+---------+
- Dto 和 Entity 之间的区别是在您的实体名称末尾使用实体,例如
UserEntity
<
关于java - org.postgresql.util.PSQLException : ERROR: column user0_. id 不存在 - hibernate ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45782327/