一个小问题,但我想知道是否有人知道我为什么会得到以下行为。我有一个带有UNION指令的大型select语句。我需要将此语句称为输入列表。因此:
Connection connection = createConnection();
PreparedStatement statement = connection.prepareStatement(dbLoadOneQuery, TYPE_FORWARD_ONLY, CONCUR_READ_ONLY);
for (Integer param : params) {
statement.setInt(1, param);
statement.setInt(2, param);
statement.addBatch();
}
statement.execute();
do {
ResultSet resultSet = statement.getResultSet();
// snip
} while (statement.getMoreResults());
现在,我知道我可以通过多种方式完成这项工作。是否有更好的方法不是问题。相反,我想知道为什么我的结果会串成一团?我需要从我的陈述中读取3-4个单独的ResultSet。它们与工会不对应,它们的大小不同,而且数据不是任何特定形式的组。
我猜这是一个驱动程序特定的东西,但我找不到允许这种行为的JDBC规范。来自库jconn4的驱动程序为com.sybase.jdbc4.jdbc.SybDriver
。
jConnect (TM) for JDBC(TM)/7.07 GA(Build 26666)/P/EBF19485/JDK 1.6.0/jdbcmain/Wed Aug 31 03:14:04 PDT 2011
答案 0 :(得分:1)
这不执行UNION查询,它正在批处理 n 单独的查询(dbLoadOneQuery
与 n 不同的组合参数),并一次执行它们,然后检索 n 单个ResultSet(每个查询一个)。
如果你想要UNION
,那么实际执行UNION
查询。
根据您的查询,例如:
StringBuilder query = new StringBuilder();
query.append(dbLoadOneQuery);
int queryCount = params.size();
// If we have more than one parameter add a UNION clause:
while (queryCount-- > 1) {
query.append(" UNION ").append(dbLoadOneQuery);
}
PreparedStatement statement = connection.prepareStatement(query.toString());
int paramIdx = 1;
for (Integer param : params) {
statement.setInt(paramIdx++, param);
statement.setInt(paramIdx++, param);
}
ResultSet rs = statement.executeQuery();