sql >> データベース >  >> RDS >> PostgreSQL

PostgresUUIDJDBCが機能しない

    tl; dr

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

    詳細

    (a)コードを表示してください。

    PreparedStatement::setObject java.util.UUIDを渡すときに機能します 。コードに他の問題がある可能性があります。

    (b)少しの議論とサンプルコードについては、私のブログ投稿「JDBCからPostgresまでのUUID値」を参照してください。

    // 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用の最新のJavaJDBCドライバーは、UUIDをネイティブにサポートすると主張しています

    どのドライバー? Postgresには少なくとも2つのオープンソースJDBCドライバーがあります。現在/レガシーのものと、新しいリライト「次世代」のものです。また、他の商用ドライバーもあります。

    「生まれつき」?読んだドキュメントにリンクできますか? SQL仕様にはUUIDのデータ型がないため(残念ながら☹)、JDBC仕様にはUUIDのデータ型がありません。回避策として、PostgresのJDBCドライバーはsetObjectを使用します およびgetObject PreparedStatementのメソッドは、Java↔SQL↔Postgresの間の溝を越えてUUIDを移動します。上記のサンプルコードを参照してください。

    PreparedStatement JDBCドキュメントにあるように:

    任意のパラメーター型の変換が必要な場合は、メソッドsetObjectをターゲットSQL型で使用する必要があります。

    おそらく「ネイティブに」、Postgresのデータ型としてのUUIDのネイティブサポートと、UUIDデータ型を持つJDBCを混同しました。 Postgresは実際にデータ型としてUUIDをサポートしています。つまり、値はASCIIまたはUnicodeの16進文字列として保存された場合の複数倍ではなく、128ビットとして保存されます。また、ネイティブであるということは、Postgresがそのタイプの列にインデックスを作成する方法を知っていることも意味します。

    上記の私のブログ投稿のポイントは、Java ↔ SQL ↔ Postgresの間の隙間を埋めるのがいかに簡単であるかに嬉しい驚きを覚えたことです。 。教育を受けていない最初の試みでは、私は一生懸命働いていました。

    UUIDをサポートするPostgresに関する別の注意事項…Postgresは、既存のUUID値を格納、インデックス付け、および取得する方法を知っています。 生成するには UUID値、Postgres拡張機能(プラグイン)uuid-osspを有効にする必要があります 。この拡張機能は、さまざまな種類のUUID値を生成するためにOSSPプロジェクトによって提供されるライブラリをラップします。手順については、私のブログを参照してください。

    ちなみに…

    JDBCエキスパートグループまたはJSRチームにJDBCにUUIDを認識させる方法を知っていれば、確かにそうします。彼らは、JSR 310で定義されている新しい日時タイプ:Date andTimeAPIに対してまさにそれを行っています。

    同様に、SQL標準委員会にUUIDのデータ型を追加するように請願する方法を知っていれば、そうします。しかし、どうやらその委員会はソビエトの政治局よりも秘密主義であり、氷河よりも遅いようです。



    1. SQL:2つのフィールドに基づいて重複を見つける方法は?

    2. MariaDBの日付と時刻の単位

    3. SQLServerテーブル列の文字列を置き換える方法

    4. ListViewアイテムへの画像の割り当てチュートリアル-03