2009-11-01 4 views
3

Je suis en train de configurer une requête paramétrées à l'effet de:requête paramétrée: Vérifiez si le champ est dans le tableau de valeurs dans l'instruction SELECT

SELECT field1 FROM myTable WHERE field2 IN (1,2,3,4) 

La base de données J'utilise est Postgres.

Cette requête s'exécute avec succès sans être paramétrée, mais j'aimerais utiliser une requête paramétrée avec un JdbcTemplate pour remplir la liste des valeurs field2 valides (qui sont des entiers).

Essayer différentes valeurs pour var ("1,2,3,4", "[1,2,3,4]", "{1,2,3,4}" ou "(1,2,3,4)") J'ai essayé des variations sur la requête:

myJdbcTemplate.query("SELECT field1 FROM field2 IN (?)", new Object[]{ var }) 

et

myJdbcTemplate.query("SELECT field1 FROM field2 IN (?::integer[])", new Object[]{ var }) 

et aussi

myJdbcTemplate.query("SELECT field1 FROM field2 IN ?::integer[]", new Object[]{ var }) 

Sur une note de côté, les ressources qui décrivent comment paramétrer les requêtes seraient également très utiles. Toutes ces requêtes lancent des PSQLExceptions qui indiquent que l'opérateur a échoué ou qu'il y a une incompatibilité de type - ce qui semble raisonnable car je n'arrive pas à comprendre comment paramétrer la requête.

Répondre

5

Jetez un oeil à la Spring Data Access web page, en particulier la section 11.7.3 où l'utilisation du NamedParameterJdbcTemplate pour construire une clause «IN» est couverte.

par exemple.

NamedParameterJdbcTemplate jdbcTemplate = new NamedParameterJdbcTemplate(dataSource); 
String sql = "select * from emp where empno in (:ids)"; 
List idList = new ArrayList(2); 
idList.add(new Long(7782)); 
idList.add(new Long(7788)); 
Map parameters = new HashMap(); 
parameters.put("ids", idList); 
List emps = jdbcTemplate.query(sql, parameters, new EmpMapper()); 
+0

Merci - c'est exactement ce que je cherchais. –

2

Je pris un autre regard sur le manuel, il ressemble à search arrays il y a une autre syntaxe, quelque chose comme:

SELECT field1 FROM myTable WHERE field2 = ANY(ARRAY[1,2,3,4]) 

paramétrables comme:

myJdbcTemplate.query("SELECT field1 FROM myTable WHERE field2 = ANY(?::integer[])"), new Object[]{ "{1,2,3,4}" }) 
Questions connexes