Java 使用NamedParameterJDBCTemplate对象指定要查询的mysql字段和值

Java 使用NamedParameterJDBCTemplate对象指定要查询的mysql字段和值,java,spring,jdbc,Java,Spring,Jdbc,我目前正在学习JavaSpring框架,我很难理解为什么下面的查询无法从数据库返回任何结果 我最终尝试在OffersDAO类中创建一个where方法,该方法允许我查询特定字段中的特定值 public List<Offer> where(String field, String value){ MapSqlParameterSource params = new MapSqlParameterSource(); params.addValue("field", fie

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

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

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

    });

}
显然,动态指定字段名有问题。我猜这很可能是因为字段键是作为mysql字符串插入的,而事实上mysql需要:字段占位符的列名

我的问题如下:

String sql = "select * from offers where name = :value";
有没有一种方法可以通过使用jdbc NamedParameterJdbcTemplate类来完成我在上面尝试的工作

如果我不能做到以上,我可以用什么方法

多谢各位


编辑:不引发任何异常。如果我试图提供列名,将返回一个空结果集。

如何在筛选器中包括所有可能的字段,但通过字段名参数限制其使用。像这样:

select * from offers where 
('name'=:field and name = :value)
OR
('field2'=:field and field2 = :value)
OR
('field3'=:field and field3 = :value)

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

保持查询与模板相似:

String sql = "select * from offers where ##field = :value";
每次执行之前,都用所需的列替换value参数。
然后你就走了。

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

在这种情况下有什么例外?没有例外。相反,只返回一个空的结果集。您是否通过运行concrette查询获得空结果?当我运行具体查询时,如在select*from offers中,name='foo';我得到了案例2中返回的例外数量的结果。当我使用sql字符串:select*from offers,其中name=:value;我认为params的可能副本基本上是一个散列,sql语句中的键查询该散列以获取特定键的值。也许我使用的键域和值在哪里混淆了?啊,对不起,我误解了一些东西。我编辑了这篇文章