【发布时间】:2016-12-06 09:47:53
【问题描述】:
我有以下代码部分来实现下拉菜单。根据从菜单中选择的两个参数,我通过将所选列替换为映射的列名来运行相应的查询。
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:
能否请人阐明正在发生的事情以及(建议完全重新设计的建议除外)实现预期功能的最佳方式是什么?我不想使用列索引,因为顺序更改会破坏功能。
【问题讨论】:
-
数据库可能会或可能不会返回名称,这取决于 JDBC 驱动程序。但是您还没有告诉您使用的是哪个数据库或 jdbc 驱动程序。
-
@M.Deinum 我们正在使用 SAP HANA 数据库,同样的 JDBC 驱动程序。但是,我不认为这是驱动程序的问题。在其他一些地方,我们没有将列设置为“?”/占位符,我们可以通过列名来引用列。我怀疑这是 Spring JDBC 内部工作方式的一些怪癖。
-
EHrm... 您只能在 where 子句中使用
?... 其他任何地方都不能... 这与 spring 无关,而是 jdbc 的工作原理。 -
另外,如果您只有 2 列,并且您不知道名称,如何在提取器中对其进行硬编码?!
-
@M.Deinum 这取决于数据库,有些数据库允许在选择中使用
?,有些需要显式转换类型信息的参数,有些则完全不允许。
标签: java spring jdbc resultset