Postgres UUID JDBC ne fonctionne pas
La dernière version de Java JDBC pour postgres prétendent soutenir l'Uuid nativement; travail à l'encontre de Postgresql 9.2 (mac).
En effet, lorsqu'un PreparedStatement est utilisé, je peux étape à travers le code de pilote, et même à pied
par le biais de l'spécialisés "setUuid' dans AbstractJdbc3gStatement.java. Selon toutes les indications, il doit "juste travail".
Toutefois, il ne fonctionne pas. La base de données jette en arrière une erreur que je reçois:
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]
Oui, en effet, setUuid dans le pilote JDBC de n'envoyer qu'un 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);
}
}
Ce qui donne?
Est-il de la magie des runes nécessaires dans la base de données de bénir cette conversion ?
source d'informationauteur user340535
Vous devez vous connecter pour publier un commentaire.
tl;dr
Détails
(a) montre-nous ton code.
PreparedStatement::setObject
fonctionne lors du passage d'unjava.util.UUID
. Vous avez probablement un autre problème dans votre code.(b) Voir mon blog UUID Valeurs De JDBC pour Postgres pour un peu de discussion et un exemple de code.
(c) je ne suis pas sûr de ce que tu veux dire par
Qui pilote? Il y a au moins deux open-source des pilotes JDBC pour Postgres, la courant/legacy on et une nouvelle réécriture de la "prochaine génération" un. Et il y a d'autres conducteurs de véhicules commerciaux.
"nativement"? Pouvez-vous le lien vers la documentation que vous avez lu? Le SQL spec a pas de type de données pour UUID (malheureusement ☹), donc la JDBC spec n'a pas de type de données pour les UUID. Comme solution, le pilote JDBC pour Postgres utilise le
setObject
etgetObject
méthodes sur PreparedStatement de déplacer l'UUID à travers le gouffre entre Java ↔ SQL ↔ Postgres. Consultez l'exemple de code ci-dessus.Comme le PreparedStatement JDBC doc dit:
Peut-être par "nativement", vous confus Postgres' la prise en charge native pour les UUID comme un type de données avec JDBC avoir un UUID type de données. Postgres, en effet, de soutien UUID comme un type de données, ce qui signifie que la valeur est stockée en tant que de 128 bits au lieu de plusieurs fois que si elle étaient stockés sous forme ASCII ou Unicode chaîne hexadécimale. Et étant natif signifie aussi Postgres sait comment créer un index sur une colonne de ce type.
Le point de mon blog mentionné ci-dessus a été que j'ai été agréablement surpris par la façon dont il est facile de combler le fossé entre
Java ↔ SQL ↔ Postgres
. Dans mon premier incultes tentatives, j'ai travaillé trop dur.Une autre remarque à propos de Postgres soutenir UUID... Postgres sait comment stocker, indexer, et de récupérer de l'existant UUID valeurs. Pour générer UUID valeurs, vous devez activer la Postgres extension (plugin)
uuid-ossp
. Cette extension enveloppements une bibliothèque fournie par L'OSSP Projet pour la production d'une variété de types de UUID valeurs. Voir mon blog pour plus d'instructions.Par la voie...
Si je savais comment pétition JDBC groupe d'experts ou JSR équipe pour faire de JDBC conscient de l'UUID, je ne serais certainement. Ils le font pour la nouvelle date-heure étant des types définis dans JSR 310: la Date et l'Heure de l'API.
De même, si je savais comment pétition SQL comité de normalisation pour ajouter un type de données de l'UUID, je le ferais. Mais apparemment ce comité est plus secret que le Politburo Soviétique et plus lent qu'un glacier.
J'ai utilisé la méthode suivante pour ajouter UUID et d'autres objets de postgres:
Cette façon vous serez en arrêt-vous de faire la conversion de type. Ce morceau de code a fonctionné parfaitement pour moi, pour tout le temps, par exemple, même json.
essayer