我有这个Java对象,我将用它来存储表中的计数元素:
private DCDataObj dc;
public class DCDataObj
{
private int datacenter; // Datacenters
.............
public DCDataObj()
{
}
public DCDataObj(int datacenter..........)
{
this.datacenter = datacenter;
..........
}
public int getDatacenter()
{
return datacenter;
}
public void setDatacenter(int datacenter)
{
this.datacenter = datacenter;
}
..........
}
我使用此SQL查询将组件计入Oracle表:
ps = conn.prepareStatement("SELECT COUNT(1) AS CNT FROM COMPONENTSTATS CS, COMPONENTTYPE CT "
+ " WHERE CS.COMPONENTTYPEID = CT.COMPONENTTYPEID AND CT.COMPONENTTYPEID IN ( "
+ " ?, ?, ?, ?, ?, ?, ?, ?, ?, ? " // 10
+ " ?, ?, ?, ?, ?, ?, ?, ?, ?, ? " // 20
+ " ?, ?, ?, ?, ?, ?, ?, ?, ?, ? " // 30
+ " ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) " // 40
+ " GROUP BY CT.NAME ORDER BY CT.NAME");
ps.setInt(1, 1000);
......
我使用此Java代码获得结果:
ResultSet result = ps.executeQuery();
while (result.next())
{
dc = new DCDataObj(
result.getInt(1),
result.getInt(2),
result.getInt(3),
...........
);
}
执行查询时出现此问题:
java.sql.SQLException: Invalid column index
你能帮我解决这个问题吗?
的更新 的
The SQL query works. I get this result:
CNT
----------------------
1
1
1 1
我怀疑问题出现在返回类型中。我想我得到的结果是数组。但是,如果不使用Array,我可以以某种方式将查询结果插入到Java对象中吗?
答案 0 :(得分:1)
在每一行上,以“?”结尾但下一行以另一个“?”开头没有逗号。然后你最后看到的部分字符串看起来像“,??”,这是无效的JDBC语法。你所有的“?”之间需要逗号。占位符。
试试这个,在“10”,“20”和“30”行的末尾添加逗号。
ps = conn.prepareStatement("SELECT CT.NAME AS COMPONENT_TYPE, COUNT(1) AS CNT FROM COMPONENTSTATS CS, COMPONENTTYPE CT "
+ " WHERE CS.COMPONENTTYPEID = CT.COMPONENTTYPEID AND CT.COMPONENTTYPEID IN ( "
+ " ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, " // 10
+ " ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, " // 20
+ " ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, " // 30
+ " ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) " // 40
+ " GROUP BY CT.NAME ORDER BY CT.NAME");
修改强>
现在我看到了你的数据,我看到了问题。您无法调用引用数据的getInt
,仅引用列标题名称或基于1的列索引。此外,您的“COMPONENT_TYPE”是字母数字,请使用getString
代替getInt
。这也意味着您必须更改DCDataObj
课程,使String
成为datacenter
,而不是int
。
尝试
dc = new DCDataObj(
result.getString("COMPONENT_TYPE"),
...........
);
或
dc = new DCDataObj(
result.getString(1),
...........
);
答案 1 :(得分:0)
绑定变量或INTO规范中的冒号后跟一个不合适的名称,也许是一个保留字。您需要更改变量名称并重试该操作。您是否尝试使用pl / sql或SQL plus或oracle终端从查询中获得结果?只是为了确保您正在执行正确的查询。
答案 2 :(得分:0)
SELECT语句中没有提取名为“DATACENTER”的列。它应该是在result.getInt调用中的COMPONENT_TYPE或CNT。