sql >> Base de Datos >  >> RDS >> PostgreSQL

Postgres UUID JDBC no funciona

tl;dr

myPreparedStatement.setObject( 
    … , 
    java.util.UUID.randomUUID()
)

Detalles

(a) Muéstranos tu código.

PreparedStatement::setObject funciona cuando se pasa un java.util.UUID . Es probable que tenga algún otro problema en su código.

(b) Consulte la publicación de mi blog Valores UUID de JDBC a Postgres para obtener un poco de discusión y código de ejemplo.

// 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) No estoy seguro de lo que quieres decir con

Los últimos controladores Java JDBC para postgres afirman admitir UUID de forma nativa

¿Qué conductor? Hay al menos dos controladores JDBC de código abierto para Postgres, el actual/heredado y uno nuevo reescrito de "próxima generación". Y también hay otros conductores comerciales.

¿"nativamente"? ¿Puedes vincular a la documentación que leíste? La especificación SQL no tiene tipo de datos para UUID (desafortunadamente ☹), por lo tanto, la especificación JDBC no tiene tipo de datos para UUID. Como solución alternativa, el controlador JDBC para Postgres usa el setObject y getObject Los métodos en PreparedStatement mueven el UUID a través del abismo entre Java ↔ SQL ↔ Postgres. Consulte el código de ejemplo anterior.

Como dice el documento JDBC de PreparedStatement:

Si se requieren conversiones de tipos de parámetros arbitrarios, se debe usar el método setObject con un tipo de SQL de destino.

Quizás por "nativamente", confundió el soporte nativo de Postgres para UUID como un tipo de datos con JDBC que tiene un tipo de datos UUID. De hecho, Postgres admite UUID como un tipo de datos, lo que significa que el valor se almacena como 128 bits en lugar de varias veces si se almacenara como una cadena hexadecimal ASCII o Unicode. Y ser nativo también significa que Postgres sabe cómo crear un índice en una columna de ese tipo.

El punto de mi publicación de blog mencionada anteriormente fue que me sorprendió gratamente lo simple que es salvar ese abismo entre Java ↔ SQL ↔ Postgres . En mis primeros intentos sin educación, estaba trabajando demasiado.

Otra nota sobre el soporte de UUID de Postgres... Postgres sabe cómo almacenar, indexar y recuperar valores de UUID existentes. Para generar valores de UUID, debe habilitar la extensión de Postgres (complemento) uuid-ossp . Esta extensión envuelve una biblioteca proporcionada por The OSSP Project para generar una variedad de tipos de valores UUID. Consulte mi blog para obtener instrucciones.

Por cierto…

Si supiera cómo solicitar al grupo de expertos de JDBC o al equipo de JSR que informen a JDBC sobre el UUID, sin duda lo haría. Están haciendo exactamente eso para los nuevos tipos de fecha y hora que se definen en JSR 310:API de fecha y hora.

Del mismo modo, si supiera cómo solicitar al comité de estándares de SQL que agregue un tipo de datos de UUID, lo haría. Pero aparentemente ese comité es más reservado que el Politburó soviético y más lento que un glaciar.