2010-11-08 5 views
0

Je suis en train d'écrire un insert de lot conditionnel basé sur Java paramètres, par exempleModèle Spring JDBC conditionnelle Insérer

List<Object[]> params = new ArrayList(); 
params.add(new Object[]{1, 2, 3}); 

getSimpleJdbcTemplate.batchUpdate(
"INSERT INTO SomeTable(colA, colB, colC)" + 
" VALUES(?, ?, ?)" + 
" WHERE EXISTS (// some condition)", params); 

Cela ne fonctionne évidemment pas et l'exemple le plus proche que j'ai trouvé implique sélectionner les valeurs INSERT à partir des tables, au lieu des arguments List, ce dont j'ai besoin. Comment puis-je référencer les paramètres Object [] dans le cadre des valeurs INSERT?

Merci.

Répondre

1

Je dirais que vous devriez déplacer cette condition dans un SELECT séparé.

+0

Pouvez-vous donner un exemple? Le problème avec SELECT, c'est que je crois que je dois référencer les valeurs de la table, alors que je veux juste faire référence aux variables du paramètre java. – meiguoren

0

Comme votre exemple, vous devriez essayer la syntaxe suivante et la méthode SimpleJdbcOperations.update:

getSimpleJdbcTemplate.update(
    " INSERT INTO SomeTable(colA, colB, colC)" + 
    " SELECT srcA, srcB, srcC" + 
    " FROM src_table" + 
    " WHERE EXISTS (// some condition)", 
    params 
); 

De plus, je l'ai utilisé StringTemplate pour la génération de SQL dynamique. C'est la meilleure langue que j'utilise.

pour l'exemple (comme StringTemplate Syntaxe):

StringTemplate tmpl = new StringTemplate(
    " SELECT *" + 
    " FROM some_table" + 
    " WHERE 1 = 1" + 
    "$search_age:{ AND age = ?}$" + 
    "$search_name:{ AND name = ?}$" 
); 


/** 
* if param_age is not null, "AND age = ?" would be included in argumented sql, 
* same as param_name 
*/ 
tmpl.setAttribute("age", param_age); 
tmpl.setAttribute("name", param_name); 
// :~) 

String sqlTmpl = tmpl.toString(); // final SQL generated 
Questions connexes