我目前正在学习Java Spring Framework,我很难理解为什么以下查询无法从数据库返回任何结果。
我最终尝试在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占位符的列名。 / p>
我的问题如下:
使用jdbc NamedParameterJdbcTemplate类,有没有办法完成我上面尝试做的事情?
如果我不能完成上述任务,可以通过什么方式完成?
谢谢
编辑:不会抛出任何异常。在我尝试提供列名称的情况下,返回空结果集。
答案 0 :(得分:1)
您不能在参数中指定字段名称 - 仅指定字段值。由于您在编写代码时知道数据库模式,因此这不应该是一个大问题。
答案 1 :(得分:0)
如何在过滤器中包含所有可能的字段,但是按字段名称参数限制它们的使用。像这样:
select * from offers where
('name'=:field and name = :value)
OR
('field2'=:field and field2 = :value)
OR
('field3'=:field and field3 = :value)
答案 2 :(得分:0)
我不知道你如何用spring实现它(我的意思是使用变量列名),但我可以建议使用以下原则。
保持您的查询类似于模板:
String sql = "select * from offers where ##field = :value";
每次执行replace ##value parameter
前都有你想要的列。
然后你走了。