31 votes

Comment générer une liste sql dynamique "in (...)" via Spring JdbcTemplate ?

Est-il possible de générer des listes arbitraires "in ()" dans une requête SQL à travers un modèle Jdbc :

exemple :

"select * from t where c in (#)" Cependant, "#" pourrait être une liste arbitraire de valeurs connues uniquement au moment de l'exécution.

1 votes

1 votes

37voto

axtavt Points 126632

Oui, c'est possible dans Spring si vous utilisez NamedParameterJdbcTemplate o SimpleJdbcTemplate avec des paramètres nommés. Le paramètre de liste peut être défini comme un java.util.List :

List<String> list = new ArrayList<String>();

list.add("A");
list.add("B");
list.add("C");

List<SomeObject> result = simpleJdbcTemplate.query("SELECT * FROM t WHERE c in (:list)",
    new RowMapper<SomeObject>() { ... },
    Collections.singletonMap("list", list));

Dans ce cas, Spring crée en interne la requête SQL avec le nombre requis de placeholders en fonction de la taille de la liste réelle lorsqu'on remplace les paramètres nommés par ? s.

5 votes

Cela ne fonctionne pas si vos arguments IN(...) ne sont pas des chaînes de caractères (texte). Par exemple, si vous voulez passer une List<Long> de cette façon, vous obtiendrez Wrong data type : java.lang.NumberFormatException : For input string : "[2, 3, 4]"

0 votes

@ShivanDragon Y a-t-il une manière correcte de le faire dans ce cas ? Remarque générale sur la réponse originale. Avec java 8, vous pouvez utiliser le format lambda (rs, rowNum) -> {...} à la place de new RowMapper<SomeObject>() { ... } .

0voto

Vinay Points 189

SimpleJDBCTemplate n'est plus disponible. Vous pouvez utiliser NamedParameterJdbcTemplate à la place. Vous trouverez un exemple de code ci-dessous. Si vous avez plusieurs paramètres de nature différente, vous pouvez utiliser Object comme clé, sinon utilisez votre List<T>

String sqlAllEmpl = queryLoader.getProperty("allEmployeesByLevelAndPeriod");
        Map<String, Object> paramMap = new HashMap<String, Object>();
        paramMap.put("level", levelStr);
        paramMap.put("periodList", periodList);

        gridList = namedParameterJdbcTemplate.query(sqlAllEmpl, paramMap, new YourRowMapper());

votre sqlAllEmpl aura deux titulaires de place, level - et periodList - qui est une liste utilisée dans l'instruction IN de sql.

0voto

James Zhou Points 9

Dans Hibernate , vous pouvez utiliser l'exemple suivant :

if(tenors != null && tenors.length >0)
            sql.append(" and ip.tenor_id in (:tenors)");

.....

if(tenors != null && tenors.length >0){
    query.setParameterList("tenors", tenors);                                 
}
.....
SQLQuery query = (SQLQuery) getSession().createSQLQuery(sql.toString())

2 votes

La question ne portait pas sur Hibernate mais sur le modèle Spting JDBC.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X