0

我目前正在学习 Java Spring 框架,我很难理解为什么以下查询无法从数据库返回任何结果。

我最终试图where在我的类中创建一个方法OffersDAO,允许我在特定字段上查询特定值。

public List<Offer> where(String field, String value){

    MapSqlParameterSource params = new MapSqlParameterSource();
    params.addValue("field", field);
    params.addValue("value", value);
    String sql = "select * from offers where :field = :value";
    return jdbc.query(sql, params, new RowMapper<Offer>(){

        public Offer mapRow(ResultSet rs, int arg1) throws SQLException {
            Offer offer = new Offer();
            offer.setId(rs.getInt("id"));
            offer.setName(rs.getString("name"));
            offer.setText(rs.getString("text"));
            offer.setEmail(rs.getString("email"));
            return offer;   
        }

    });

}

当我明确指定字段时,我能够成功地查询数据库以获取结果,如下所示:

String sql = "select * from offers where name = :value";

显然动态指定字段名有问题。我的猜测很可能是由于field密钥作为 mysql 字符串(带有'')插入,而事实上 mysql 需要 :field 占位符的列名。

我的问题如下:

  1. 有没有办法使用 jdbc NamedParameterJdbcTemplate 类来完成我在上面尝试做的事情?

  2. 如果我不能做到以上,我可以通过什么方式?

谢谢

编辑:不抛出异常。在我尝试提供列名的情况下,将返回一个空结果集。

4

3 回答 3

1

您不能在参数中指定字段名称 - 只能指定字段值。由于您在编写代码时知道 DB 模式,因此这应该不是什么大问题。

于 2013-11-12T11:44:13.900 回答
0

如何在过滤器中包含所有可能的字段,但通过字段名称参数限制它们的使用。像这样:

select * from offers where 
('name'=:field and name = :value)
OR
('field2'=:field and field2 = :value)
OR
('field3'=:field and field3 = :value)
于 2013-11-12T06:15:48.030 回答
0

我不知道您如何使用 spring 来实现它(我的意思是使用可变列名),但我可以建议使用以下原则。

保持您的查询像模板:

String sql = "select * from offers where ##field = :value";

并且每次在replace ##value parameter您想要的列执行之前。然后你走了。

于 2013-11-12T06:16:14.087 回答