2012-06-19 12 views
13

Ho un tavolo MySQL con Foos. Ogni Foo ha un codice numerico non univoco e un nome. Ora ho bisogno di trovare se qualche Foo con uno di certi codici ha un nome che inizia con una determinata stringa. In SQL normale questo sarebbe banale:Come cercare stringa LIKE 'qualcosa%' con Java Spring Framework?

select * from FOO where CODE in (2,3,5) and NAME like 'bar%'; 

Ma come dovrei farlo correttamente in Primavera ora? Senza la necessità per l'operatore 'come' lo farei in questo modo:

public List<Foo> getByName(List<Integer> codes, String namePart) { 
    String sql = "select * from FOO where CODE in (:codes) and NAME=:name" 
    Map<String,Object> params = new HashMap<String,Object>(); 
    params.put("codes", codes); 
    params.put("name", namePart); 
    return getSimpleJdbcTemplate().query(sql, new FooRowMapper(), params); 
} 

Tuttavia, con 'come' nulla sembra funzionare: NAME like :name%, NAME like ':name%', o NAME like ?% quando si utilizzano i segnaposti invece di parametri denominati.

potrei essere brutale e inseriscilo come

String sql = "select * from FOO where CODE in (:codes) and NAME like '"+namePart+"%'";` 

ma ovviamente sarebbe più bello se Primavera avrebbe sanificare i parametri di input correttamente, ecc, sai ...

Si potrebbe pensare Spring lo sosterrebbe in qualche modo ma non riesco a capirlo.

+0

il lavoro per me, se io uso: "select * from FOO in cui il codice a (: codici) e NOME come "+ namePart +" '%' "; – navy

risposta

18

Aspetta, naturalmente ho dovuto "provare ancora una cosa finale" prima di chiamare un giorno, ed ecco, tutti i miei test di unità improvvisamente pass:

public List<Foo> getByName(List<Integer> codes, String namePart) { 
    String sql = "select * from FOO where CODE in (:codes) and NAME like :name" 
    Map<String,Object> params = new HashMap<String,Object>(); 
    params.put("codes", codes); 
    params.put("name", namePart+"%"); 
    return getSimpleJdbcTemplate().query(sql, new FooRowMapper(), params); 
} 

non pensavo di entrare la "%" nel parametro, ero sicuro che Spring lo avrebbe evitato automaticamente. Mi chiedo se lo sto facendo bene?

+0

Nerf, questa era la soluzione che stavo per dare: D Questo è il modo in cui lo stavo facendo qui, prima che mi trasferissi su MyBatis, ma questa è un'altra storia: p –

+0

AFAIK Spring fa fuga ma solo per quanto riguarda la prevenzione dell'iniezione SQL. Altrimenti, LIKE si aspetta un'espressione e% fa parte dell'espressione, quindi vedo questo più o meno logicamente in questo modo. –

+0

@OlivierCoilland Ha, mi scuso per aver rubato la tua risposta.;) Grazie per la conferma però, almeno so che qualcun altro usa anche questa tecnica. E grazie per il puntatore a MyBatis; Non ne ho mai sentito parlare prima ma sembra interessante. – ZeroOne

3

Per paraemters chiamati a lavorare, è necessario utilizzare NamedParameterJdbcTemplate

params.put ("nome", "Joe%");

jdbcTemplate.query ("select * from FOO in cui il codice a (: codici) e nome simile: nome"