【发布时间】:2018-07-06 11:04:17
【问题描述】:
我在我的服务器端使用休眠框架,并使用 Postgres 作为后端。我使用枚举类型users.user_role(这里的用户是一个模式)。
ENUM 的定义是
create type users.user_role as ENUM ('Agent', 'Customer');
现在我正在使用“org.postgresql.Driver”连接到我的数据库。为此,我使用的是 postgressql-9.3-1101-jdbc4.jar。
当我尝试使用 Prepared Statement 插入值时,它工作正常。运行良好的基本代码如下所示。
String sqlQuery = "insert into users.user (user_id, created, last_modified, client_id, email, active, data, user_role_type) values (?, ?, ?, ?, ?, ?, ?, ?)";
try {
Class.forName("org.postgresql.Driver");
Connection connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/kc_abhi","postgres","root");
PreparedStatement preparedStatement = connection.prepareStatement(sqlQuery);
preparedStatement.setObject(1, UUID.fromString("d70328f0-7301-4ce7-9c3d-64938f9c6c7d"));
preparedStatement.setObject(2, new Timestamp(System.currentTimeMillis()));
preparedStatement.setObject(3, new Timestamp(System.currentTimeMillis()));
preparedStatement.setObject(4, UUID.fromString("4753fe2b-f0a6-4ee9-8cc9-8bb20b60ef73"));
preparedStatement.setObject(5, "ab@everestek.com");
preparedStatement.setObject(6, true);
PGobject pGobject = new PGobject();
pGobject.setType("json");
pGobject.setValue("{\"data\":\"data\"}");
preparedStatement.setObject(7, pGobject);
PGobject pGobject1 = new PGobject();
pGobject1.setType("user_role");
pGobject1.setValue("Customer");
preparedStatement.setObject(8, pGobject1);
int i = preparedStatement.executeUpdate();
System.out.println("i = " + i);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
问题:
当我尝试将 org.hibernate.SQLQuery 用于相同目的时,它会给出 ENUM 错误。
错误:错误:列“user_role_type”属于 users.user_role 类型,但表达式属于 bytea 类型
查询:
SQLQuery sqlQuery = currentSession().createSQLQuery("insert into users.user (user_id, created, last_modified, client_id, email, active, data, user_role_type, user_role_data) values (:userId, :created, :lastModified, :clientId, :email, :active, :data, :userRoleType, :userRoleData));
设置参数如
PGobject pGobject1 = new PGobject();
pGobject1.setType("user_role");
pGobject1.setValue("Customer");
sqlQuery.setParameter("user_role_type", "Customer");
现在对于 json 类型发生了同样的问题。我试图在 PLSQL 中为 json 发送字符串类型,但它显示
错误:错误:“数据”列是 json,但表达式是字符串类型
设置参数如
PGobject pGobject1 = new PGobject();
pGobject1.setType("json");
pGobject1.setValue(data); //here data is of type string
sqlQuery.setParameter("data", data);
【问题讨论】:
-
Hibernate 等混淆层不支持现代关系数据库的高级功能。
标签: java postgresql hibernate enums