Comment mettre à jour un postgresql colonne de tableau avec le printemps JdbcTemplate?
Je suis en utilisant le Printemps JdbcTemplate, et je suis coincé à l'endroit où j'ai une requête qui met à jour une colonne qui est en fait un tableau de int. La base de données postgres 8.3.7.
C'est le code que j'utilise :
public int setUsersArray(int idUser, int idDevice, Collection<Integer> ids) {
int update = -666;
int[] tipi = new int[3];
tipi[0] = java.sql.Types.INTEGER;
tipi[1] = java.sql.Types.INTEGER;
tipi[2] = java.sql.Types.ARRAY;
try {
update = this.jdbcTemplate.update(setUsersArrayQuery, new Object[] {
ids, idUser, idDevice }, tipi);
} catch (Exception e) {
e.printStackTrace();
}
return update;
}
De la requête "update nom_table set array_column = ? où id_user = ? et id_device = ?".
Je bénéficier de cette exception :
org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [mise à jour acotel_msp.users_mau ensemble denied_sub_client = ? où id_users = ? et id_mau = ?]; La colonne de l'index est hors de portée: 4, nombre de colonnes: 3.; exception imbriquée est org.postgresql.util.PSQLException: L'index de colonne est hors de portée: 4, nombre de colonnes: 3.
Causés par: org.postgresql.util.PSQLException: L'index de colonne est hors de portée: 4, nombre de colonnes: 3.
J'ai regardé dans spring jdbc modèle docs mais je ne peux pas trouver l'aide, je vais continuer à chercher, de toute façon, quelqu'un pourrait-il m'indiquer la bonne direction? Merci!
EDIT :
Évidemment, la commande a été mal, de ma faute...
J'ai essayé vos deux solutions, dans le premier cas, j'ai eu ceci :
org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; mauvaise grammaire SQL [mise à jour aux utilisateurs de définir des denied_sub_client = ? où id_users = ? et id_device = ?]; exception imbriquée est org.postgresql.util.PSQLException: Ne peut pas lancer une instance de java.util.Liste de tableaux de type Types.TABLEAU
Essayé la deuxième solution, j'ai eu ceci :
org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; mauvaise grammaire SQL [mise à jour aux utilisateurs de définir des denied_sub_client = ? où id_users = ? et id_device = ?]; exception imbriquée est org.postgresql.util.PSQLException: Ne peut pas lancer une instance de [Ljava.lang.Objet; à type de Types.TABLEAU
Je suppose que j'ai besoin d'une instance de java.sql.Tableau, mais comment puis-je la créer à l'aide de JdbcTemplate?
Vous devez vous connecter pour publier un commentaire.
Le type d'argument et l'argument n'est pas de correspondance.
Essayez de changer le type d'argument afin
ou de l'utilisation
et voir si cela fonctionne
http://valgogtech.blogspot.com/2009/02/passing-arrays-to-postgresql-database.html explique comment créer java.sql.Tableau postgresql
fondamentalement Tableau.getBaseTypeName doit retourner int et Tableau.toString doit retourner un tableau contenu dans "{1,2,3}" format
après la création du tableau, vous pouvez définir à l'aide de preparedstatement.setArray(...)
de PreparedStatementCreator par exemple
Bonne Chance ..
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
La façon la plus propre que j'ai trouvé jusqu'à présent est d'abord convertir le
Collection
dans unInteger[]
et ensuite utiliser leConnection
afin de les convertir en unArray
.Ceci est basé sur les informations dans la documentation: https://jdbc.postgresql.org/documentation/head/arrays.html
Après avoir lutté avec de nombreuses tentatives, nous avons opté d'utiliser un little helper ArraySqlValue pour créer de Printemps SqlValue objets Java Types de Tableau.
d'utilisation, c'est comme cela
La ArraySqlValue peut également être utilisé dans MapSqlParameterSource pour une utilisation avec NamedParameterJdbcTemplate.
ce code est fourni dans le Domaine Public