我有以下代码部分来实现下拉菜单。根据从菜单中选择的两个参数,我通过将所选列替换为映射列名来运行相应的查询。
String sql = "SELECT ?, ? FROM <table_name>";
ArrayList<Some_POJO> res = this.jdbcTemplate.query(sql, new ResultSetExtractor<Some_POJO>()
{//logic goes here.},
user_inputs_as_object_array);
现在,在逻辑部分,我使用以下命令映射返回的值:
while(rs.next()) {
Some_POJO = new SOME_POJO();
Some_POJO.setParam1(rs.getString("SOME_COLUMN_NAME")); //ERROR
}
现在,当我按名称引用列时,标记的行会失败。但令人惊讶的是,以下解决方法有效:
while(rs.next()) {
Some_POJO = new SOME_POJO();
int i = 1;
Some_POJO.setParam1(rs.getString(i)); //Works(?!)
}
我尝试修改JDBC模板调用以返回ResultSetMetaData对象而不是Some_POJO的ArrayList:
String sql = "SELECT ?, ? FROM <table_name>";
ResultSetMetaData res = this.jdbcTemplate.query(sql, new ResultSetExtractor<ResultSetMetaData>()
{//extractData now returns rs.getMetaData()},
user_inputs_as_object_array);
try
{
System.out.println("Column cout: " + res.getColumnCount());
for(int i = 1; i <= res.getColumnCount(); i++)
System.out.println("Label: " + res.getColumnLabel(i) + "\nName: " + res.getColumnName(i));
}
catch(SQLException sqle)
只得到:
Column cout: 2
Label: :1
Name:
Label: :2
Name:
是否有人可以了解正在发生的事情(除了建议完全重新设计的建议)什么是实现预期功能的最佳方式?我宁愿不使用列索引,因为订单更改会破坏功能。
答案 0 :(得分:0)
仅用于重构代码,获取值为:
ArrayList result = new ArrayList(0);
result.addAll(this.jdbcTemplate.query(sql, (RowMapper) (rs, rowNum) -> {
POJO out = new POJO();
out.setProperty1(rs.getString("prop1"));
out.setProperty2(rs.getString("prop2"));
...
return out;
}));
对我来说它运行正常,在方法中传递字段名称,不要认为spring jdbc存在一些问题。你的SQL查询可能有问题。