postgresql是区分大小写的
受限标识符或被引号修饰的标识符。它是由双引号(")包围的一个任意字符序列。一个受限标识符总是一个标识符而不会是一个关键字。因此"select"可以用于引用一个名为“select”的列或者表,而一个没有引号修饰的select则会被当作一个关键词,从而在本应使用表或列名的地方引起解析错误。在上例中使用受限标识符的例子如下:UPDATE "my_table" SET "a" = 5;
在PostgreSQL关系型数据库中存在关键字的使用的问题,例如user 做表名,create table user (id int, name,varchar(20));创建的时候需要给表名user加上双引号"user";
我有一个使用hibernate映射到postgres数据库的模型类。我的模型类是:
@Entity
@Table(name =“USER”)
public class用户{
@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”)
私有时间戳已创建;
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:错误:列user0_.id不存在
我的bash shell数据库如下所示:
hibernate如何将类属性映射到表列?它是否仅基于 @Column(name =“username”)匹配,还是根据数据类型和约束(例如唯一/自动增量)尝试匹配?
解决方法
解释
它给你这个错误:
org.postgresql.util.PSQLException:错误:列user0_.id不存在
因为当你创建一个数据库PostgreSQL时,它会创建一个名为 public 的默认模式,所以当你没有在实体中指定名称,它将在公共模式中自动检查,因为您收到此错误。
另一件事确认模式名称是正确的,错误说:
列user0_.id不存在
而不是:
列myapp.user0_.id不存在
------- ^ ---- ^
确认查询使用公共架构而不是真正的架构myapp
解决方案
要解决此问题,您必须指定架构名称,如下所示:
@Table(name =“USER”,schema =“myapp”)
建议
不要在PostgreSQL中使用表格或列名称中的大写字母。
@Table(name =“user”,schema =“myapp”)
外加Navicat破解过程https://www.jianshu.com/p/749b3f78039b