Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Postgres UUID JDBC不工作_Java_Postgresql_Jdbc_Pg Jdbc - Fatal编程技术网

Java Postgres UUID JDBC不工作

Java Postgres UUID JDBC不工作,java,postgresql,jdbc,pg-jdbc,Java,Postgresql,Jdbc,Pg Jdbc,postgres的最新Java JDBC驱动程序声称本机支持UUID;与Postgres 9.2(mac)对抗 事实上,当使用PreparedStatement时,我可以单步查看驱动程序代码,甚至可以步行 通过AbstractJdbc3gStatement.java中专门的“setUuid”函数。根据所有迹象,它应该“正常工作” 但是,它不起作用。数据库抛出一个错误,因此我收到: Caused by: org.postgresql.util.PSQLException: ERROR: opera

postgres的最新Java JDBC驱动程序声称本机支持UUID;与Postgres 9.2(mac)对抗

事实上,当使用PreparedStatement时,我可以单步查看驱动程序代码,甚至可以步行 通过AbstractJdbc3gStatement.java中专门的“setUuid”函数。根据所有迹象,它应该“正常工作”

但是,它不起作用。数据库抛出一个错误,因此我收到:

Caused by: org.postgresql.util.PSQLException: ERROR: operator does not exist: uuid = bytea
  Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts.
  Position: 139
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2157) ~[postgresql-9.2-1002.jdbc4.jar:na]
是的,的确,JDBC驱动程序中的setUuid会将其作为bytea发送:

private void setUuid(int parameterIndex, UUID uuid) throws SQLException {
        if (connection.binaryTransferSend(Oid.UUID)) {
            byte[] val = new byte[16];
            ByteConverter.int8(val, 0, uuid.getMostSignificantBits());
            ByteConverter.int8(val, 8, uuid.getLeastSignificantBits());
            bindBytes(parameterIndex, val, Oid.UUID);
        } else {
            bindLiteral(parameterIndex, uuid.toString(), Oid.UUID);
        }
    }
有什么好处? 实际数据库中是否需要一些魔法符文来支持这种转换?

tl;博士 细节 (a) 给我们看看你的代码

当通过考试时,它能工作。代码中可能存在其他问题

(b) 请参阅我的博客文章,了解一些讨论和示例代码

// Generate or obtain data to store in database.
java.util.UUID uuid = java.util.UUID.randomUUID(); // Generate a random UUID. 
String foodName = "Croissant";
// JDBC Prepared Statement.
PreparedStatement preparedStatement = conn.prepareStatement( "INSERT INTO food_ (pkey_, food_name_  ) VALUES (?,?)" );
int nthPlaceholder = 1; // 1-based counting (not an index).
preparedStatement.setObject( nthPlaceholder++, uuid ); 
preparedStatement.setString( nthPlaceholder++, foodName ); 
// Execute SQL.
if ( !( preparedStatement.executeUpdate() == 1 ) ) { 
  // If the SQL reports other than one row inserted…
  this.logger.error( "Failed to insert row into database." );
}
(c) 我不知道你说的是什么意思

postgres的最新Java JDBC驱动程序声称本机支持UUID

哪个司机?Postgres至少有两个开源JDBC驱动程序,分别是和一个新的重写。还有其他的商业司机

“天生的”?你能链接到你读过的文档吗?SQL规范没有的数据类型(很遗憾☹), 因此,UUID没有数据类型。作为一种解决方法,Postgres的JDBC驱动程序在PreparedStatement上使用
setObject
getObject
方法将UUID跨Java和Java之间的鸿沟移动↔ SQL↔ 参见上面的示例代码

正如政府所说:

如果需要任意参数类型转换,则方法setObject应与目标SQL类型一起使用

也许是“天生的”,您混淆了Postgres对UUID作为数据类型的原生支持与JDBC具有UUID数据类型。Postgres确实支持UUID作为数据类型,这意味着该值存储为128位,而不是存储为ASCII或Unicode十六进制字符串时的多次。而原生还意味着Postgres知道如何在c上构建索引那种类型的柱子

我上面提到的博客文章的要点是,我惊喜地发现在
Java之间架起鸿沟是多么简单↔ SQL↔ 博士后
。在我第一次没有受过教育的尝试中,我工作太努力了


关于Postgres支持UUID的另一个注意事项…Postgres知道如何存储、索引和检索现有UUID值。要生成UUID值,必须启用Postgres扩展(插件)。此扩展包装用于生成各种类型的UUID值。请参阅


顺便说一下

如果我知道如何请求JDBC专家组或JSR团队让JDBC意识到UUID,我当然会的。他们正在为中定义的新日期时间类型这样做


同样,如果我知道如何向SQL标准委员会申请添加UUID的数据类型,我也会这样做。但显然,该委员会比苏联政治局更秘密,也比冰川更慢。

我使用以下方法向postgres添加UUID和其他对象:

 PGobject toInsertUUID = new PGobject();
 toInsertUUID.setType("uuid");
 toInsertUUID.setValue(uuid.toString());
 PreparedStmt stmt = conn.prepareStatement(query);
 stmt.setObject(placeHolder,toInsertUUID);
 stmt.execute();
这样你就可以阻止自己进行类型转换。这段代码在任何时候都非常适合我,例如json。

试试看

.setParameter("uuid", uuid, PostgresUUIDType.INSTANCE);

这在我使用org.postgresql.postgresql42.2.5时起到了作用

myPreparedStatement.setObject(4, UUID.randomUUID(),java.sql.Types.OTHER)

如果没有java.sql.Types.OTHER,我就犯了一个错误

你能发布你试图运行的实际准备好的声明吗?>该委员会比苏联政治局更神秘,比冰川更慢……年度评论!!!PostgresUUIDType.INSTANCE来自哪里,似乎是Hibernate类?org.Hibernate.typepgobject com在哪里e from?@PaulTaylor,
org.postgresql.util.PGobject
来自postgresql JDBC驱动程序,
org.postgresql:postgresql
。非常感谢您,为了找到正确的解决方案,我经历了一场噩梦。
myPreparedStatement.setObject(4, UUID.randomUUID(),java.sql.Types.OTHER)