2012-06-19 39 views
13

Tengo una tabla MySQL con Foos. Cada Foo tiene un código numérico no único y un nombre. Ahora necesito encontrar si algún Foo con uno de ciertos códigos tiene un nombre que comienza con una cadena dada. En SQL normal, esto sería trivial:¿Cómo buscar la cadena LIKE 'something%' con Java Spring Framework?

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

Pero, ¿cómo podría hacer esto correctamente en Spring ahora? Sin la necesidad de que el operador 'como' yo lo haría así:

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); 
} 

Sin embargo, con el 'como' nada parece funcionar: NAME like :name%, NAME like ':name%', o NAME like ?% al utilizar los marcadores de posición en lugar de parámetros con nombre.

Podría ser brutal e introducirlo como

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

pero obviamente sería más agradable si la primavera sería desinfectar adecuadamente los parámetros de entrada, etc, ya sabes ...

Se podría pensar Spring apoyaría esto de alguna manera, pero no puedo resolverlo.

+0

que funcione para mí si yo uso: "SELECT * FROM FOO donde el código de (: códigos) y NAME como "+ namePart +" '%' "; – navy

Respuesta

18

Espere, por supuesto que tenía que "probar uno más última cosa" antes de llamar a un día, y he aquí, todas mis pruebas de unidad de repente pasan:

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); 
} 

No pensé de entrar el "%" en el parámetro, estaba seguro de que Spring lo escaparía automáticamente. Me pregunto si lo estoy haciendo bien?

+0

Nerf, esa fue la solución que estaba a punto de dar: D Esa es la forma en que lo hacía aquí, antes de mudarme a MyBatis, pero esa es otra historia: p –

+0

AFAIK Spring no escape, pero solo hasta la prevención de la inyección SQL. De lo contrario, LIKE espera una expresión, y% es parte de la expresión, así que veo esto más o menos lógico de esta manera. –

+0

@OlivierCoilland Ha, perdón por robar tu respuesta.;) Gracias para la confirmación, al menos, sé que otra persona también usa esta técnica. Y gracias por el puntero a MyBatis; Nunca había oído hablar de eso pero parece interesante. – ZeroOne

3

Para paraemters nombrados para trabajar, es necesario utilizar NamedParameterJdbcTemplate

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

jdbcTemplate.query ("SELECT * FROM FOO donde el código de (: códigos) y el nombre como: nombre de"

Cuestiones relacionadas