sql >> Databáze >  >> RDS >> PostgreSQL

Postgres UUID JDBC nefunguje

tl;dr

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

Podrobnosti

(a) Ukažte nám svůj kód.

PreparedStatement::setObject funguje při předání java.util.UUID . Pravděpodobně máte v kódu nějaký jiný problém.

(b) Podívejte se na můj blogový příspěvek Hodnoty UUID od JDBC po Postgres, kde najdete trochu diskuse a ukázkový kód.

// 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) Nejsem si jistý, co tím myslíte

Nejnovější ovladače Java JDBC pro postgres tvrdí, že nativně podporují UUID

Který řidič? Existují minimálně dva open-source JDBC ovladače pro Postgres, aktuální/starší a nový přepsaný „příští generace“. A existují i ​​další komerční ovladače.

"nativní"? Můžete uvést odkaz na dokumentaci, kterou jste četli? Specifikace SQL nemá žádný datový typ pro UUID (bohužel ☹), proto specifikace JDBC nemá žádný datový typ pro UUID. Jako řešení používá ovladač JDBC pro Postgres setObject a getObject metody na PreparedStatement přesunou UUID přes propast mezi Java ↔ SQL ↔ Postgres. Viz příklad kódu výše.

Jak uvádí dokument PreparedStatement JDBC:

Pokud jsou vyžadovány konverze typu libovolného parametru, měla by se s cílovým typem SQL použít metoda setObject.

Možná jste si "nativně" spletli nativní podporu Postgresu pro UUID jako datový typ s JDBC s datovým typem UUID. Postgres skutečně podporuje UUID jako datový typ, což znamená, že hodnota je uložena jako 128bitová, nikoli vícenásobná, než kdyby byla uložena jako hexadecimální řetězec ASCII nebo Unicode. A být nativní také znamená, že Postgres ví, jak vytvořit index na sloupci tohoto typu.

Smyslem mého výše uvedeného příspěvku na blogu bylo, že mě příjemně překvapilo, jak jednoduché je překlenout tu propast mezi Java ↔ SQL ↔ Postgres . Ve svých prvních nevzdělaných pokusech jsem pracoval příliš tvrdě.

Další poznámka o Postgresu, který podporuje UUID… Postgres ví, jak ukládat, indexovat a získávat existující hodnoty UUID. Chcete-li generovat hodnoty UUID, musíte povolit rozšíření Postgres (plugin) uuid-ossp . Toto rozšíření obaluje knihovnu poskytovanou projektem OSSP pro generování různých druhů hodnot UUID. Pokyny najdete na mém blogu.

Mimochodem…

Kdybych věděl, jak požádat expertní skupinu JDBC nebo tým JSR, aby upozornili JDBC na UUID, určitě bych to udělal. Dělají to právě pro nové typy data a času definované v JSR 310:Date and Time API.

Podobně, kdybych věděl, jak požádat výbor pro standardy SQL, aby přidal datový typ UUID, udělal bych to. Ale očividně je tento výbor tajnější než sovětské politbyro a pomalejší než ledovec.



  1. Archiver pozastaven kvůli KOMPATIBILNÍMU ORA-16484

  2. Dočasná tabulka serveru SQL zmizí

  3. Když je to naléhavé

  4. Přidání dalších datových úložišť do Microsoft Power BI