Comment puis-je mettre un String[] paramètre d'une requête native?
C'est mon PostgreSQL fonction:
salvarArquivoGeometricoCasoZeroPOINT
(dimensao text,tableName text,tuplas text[],srid text)
Il a un text[]
paramètre, et je veux passer un Java String[]
à partir de mon JPQL:
public String salvarGeometriaCaso0(String[] tuplas,FileDto arquivo){
Query query =
em().createNativeQuery("select
salvarArquivoGeometricoCasoZeroPOINT(?1,?2,?3,?4)");
query.setParameter(1,arquivo.getGeo());//String
query.setParameter(2,arquivo.getTable());/String
query.setParameter(3,tuplas);//String[]
query.setParameter(4,arquivo.getSrid());//String
return (String) query.getSingleResult();//function returns a Text, so cast to String
}
Le code ci-dessus échoue à l'exception:
ERROR] Internal Exception: org.postgresql.util.PSQLException: Can not infer a SQL
type to use for an instance of [Ljava.lang.String;.
Use setObject () with an explicit Types value to specify the type to use.
donc je ne sais pas comment appeler ma fonction de EclipseLink.
Avez-vous "[Aide]
Pouvez-vous me montrer comment faire cela?
Au lieu de
Mais je suis en utilisant EclipseLink. J'ai à suivre certains modèles, je ne peux pas utiliser un PreparedStatement.
Qui EclipseLink version? Et qui PgJDBC version? Je pensais que EclipseLink et PgJDBC compris que
setObject ()
explicite Types
valeur pour spécifier le type d'utilisation?"Pouvez-vous me montrer comment faire cela?
Au lieu de
query.setParameter(3, tuplas)
vous souhaitez appeler setObject()
sur un PreparedStatement
. docs.oracle.com/javase/7/docs/api/java/sql/...Mais je suis en utilisant EclipseLink. J'ai à suivre certains modèles, je ne peux pas utiliser un PreparedStatement.
Qui EclipseLink version? Et qui PgJDBC version? Je pensais que EclipseLink et PgJDBC compris que
String[]
mappé à text[]
.OriginalL'auteur Bernardo Vale | 2012-08-20
Vous devez vous connecter pour publier un commentaire.
Test en passant un Java de tableau de type String[] pour
PreparedStatement.setObject(...)
résultats dans le comportement. Il semble que PgJDBC ne pas accepter un Java tableau comme argument àPreparedStatement.setObject()
, avec ou sansTypes.ARRAY
paramètre.Conformité
JDBC spec, 16.5 "Tableau d'Objets", suggère que le JDBC
Array
existe en partie, afin que le client n'a pas à copier les grands tableaux dans la mémoire, ils peuvent être utilisés par référence. Je ne suis pas trop sûr si le pilote JDBC est tenu d'accepter les premières Java les tableaux comme paramètres. Tous les spec code fait référence àjava.sql.Array
et la spécification précise que les tableaux sont mappés par laArray
interface à l'Annexe B et à l'étranger. Dans une recherche rapide/lecture que j'ai pu trouver pas mention du passage des premières Java les tableaux autres quebyte[]
comme paramètres ou du retour des résultats.Toutefois, dans le §16.5.4 la JDBC4.2 projet de spec lit:
bien que tout le reste du code, il se réfère à
Array
objets. Signifient-ilsArray
par "un tableau Java"? Ou veulent-ils dire un raw natif Java tableau commeString[]
?Il me semble que les clients sont censés utiliser le
java.sql.Array
interface viaConnection.createArrayOf(...)
, de sorte que EclipseLink est probablement de faire la mauvaise chose.Quoi faire à ce sujet
Essayez de mettre à jour EclipseLink à 2,4 dans l'espoir qu'il utilise l'précisent la méthode de passage de tableaux à via JDBC java.sql.Objet Array.
Vous pouvez aussi avoir besoin d'annoter le mapping avec
@Array
, un EclipseLink extension. Voir aussi ce fil de discussion du forum re 2.3 et bug 361701.Il apparaît que vous pouvez implémenter votre propre type de gestionnaire pour EclipseLink afin de remplacer son comportement. Pour définir correctement un paramètre de tableau via PgJDBC vous devez utiliser:
... où
conn
etpstmt
sont unjava.sql.Connection
et unPreparedStatement
respectivement, etstrArray
est unString[]
instance.Voir Les types de données personnalisés dans le eclipselink wiki.
Sur une note de côté, l'utilisation d'un type string name pour spécifier la matrice du type de données dans
createArrayOf
semble sorte de fou compte tenu de l'existence dejava.sql.Types
. Il fait la portabilité beaucoup plus difficile; le code ci-dessus ne fonctionne pas (dire) d'Oracle, Oracle veutVARCHAR
pastext
comme un nom de type.Remarque: L'unité de test
org/postgresql/test/jdbc2/ArrayTest.java
aArrayTest.testSetArray()
, à la ligne 166 tests:... cependant, le type de
arr
estjava.sql.Array
, pasint[]
. C'est un JDBC de type tableau, n'est pas régulier Java tableau.OriginalL'auteur Craig Ringer
Je suis très en retard pour répondre.
Cette solution de contournement à l'aide de postgreSQL fonction intégrée, ce qui a fonctionné pour moi.
référence blog
1) convertit une Chaîne de Tableau par des Virgules Chaîne
Si vous utilisez Java8, il est assez facile. d'autres options sont ici
2) PostgreSQL fonction intégrée string_to_array()
vous pouvez trouver d'autres postgreSQL fonctions de tableau ici
OriginalL'auteur Dhruvil Thaker
Il semble EclipseLink ne résout pas le bug 361701. mentionné par @Craig Sonnerie.
La seule façon de passer une Chaîne de caractères[] comme un paramètre à l'aide de JDBC sans EclipseLink. Vérifier le code.
ConnectionHelper c'est mon java.sql.La classe de connexion.
J'apprécie l'aide de vous les gars: @Craig Sonnerie et @Matt Balle, Merci.
OriginalL'auteur Bernardo Vale