如何使用 Java Spring Framework 搜索字符串 LIKE 'something%'?

新手上路,请多包涵

我有一个带有 Foos 的 MySQL 表。每个 Foo 都有一个数字非唯一代码和一个名称。现在我需要查找具有特定代码之一的任何 Foo 是否恰好具有以给定字符串开头的名称。在普通的 SQL 中,这是微不足道的:

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

但是我现在如何在 Spring 中正确地执行此操作?不需要“like”运算符,我会这样做:

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

但是,“喜欢”似乎没有任何作用: NAME like :name%NAME like ':name%'NAME like ?% 而不是使用命名参数时

我可以很残酷地输入它

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

但很明显,如果 Spring 能正确地清理输入参数等,那就太好了,你知道的……

你会认为 Spring 会以某种方式支持这一点,但我无法弄清楚。

原文由 ZeroOne 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 424
2 个回答

等等,当然我不得不在收工前“再做最后一件事”,你瞧,我所有的单元测试突然都通过了:

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

我没想到在参数中输入“%”,我确定 Spring 会自动将其转义。我想知道我做得对吗?

原文由 ZeroOne 发布,翻译遵循 CC BY-SA 3.0 许可协议

要使命名参数起作用,您需要使用 NamedParameterJdbcTemplate

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

jdbcTemplate.query("select * from FOO where CODE in (:codes) and NAME like :name"

原文由 Istvan Devai 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题