我有一个使用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;
    }
}

我try 使用以下查询检索用户名为"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

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

推荐答案

##解决方案

PostgreSQL中,必须指定模式的名称,如下所示:

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

##说来话长

你犯了这个错误:

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

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


##良好做法

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

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

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

Postgresql相关问答推荐

一列引用两个不同的表

PostgreSQL:重新创建主键值以匹配记录计数

列不明确

Postgres:这是对OVERLAPS谓词的等效重写吗?

我可以使用 SQLAlchemy 映射数据类创建 Postgres `GENERATED ALWAYS AS` 列吗?

如何在 kubernetes 中安全地重启 postgresql 容器?

在 postgresql 数据库 timestampz 中保留用户偏移量

如何在typeorm和嵌套js中将运行时变量设置为postgresql

当脚本工作时,Postgres now() 时间戳不会改变

使用 ON CONFLICT 从 INSERT 返回行,无需更新

Heroku PGError:operator does not exist: character varying = integer

如何在容器内创建 postgres 扩展?

'active' 标志与否?

?(问号)运算符在 Rails 中查询 Postgresql JSONB 类型

使用 PostGIS 查找给定点的 n 个最近邻?

如何为 postgres 连接设置 application_name?

将数据推送到 Heroku 时出错:time zone displacement out of range

如何在 psql 中设置默认显示模式

Postgresql 对象 ID 和元组

PostgreSQL - GROUP BY 子句或用于聚合函数