下面的方法从SQL数据库获取结果集并填充Map<String,String>
。它在大多数情况下运行良好,但是通过这个特定的查询,我得到一个例外:
无法执行查询:
select RULEID, GRAPHRULE from GRAPHRULE3D WHERE GRAPHRULE LIKE '%1717-002%' AND GRAPHRULE NOT LIKE '%DRAWING%'
引起:com.microsoft.sqlserver.jdbc.SQLServerException:列名('1717-002');无效。
查询本身适用于SQL Server。为什么它认为第二列中的('1717-002');
是列名,而它实际上是一个值?
问题跟随String value = rs.getString(rs.getString(2).trim());
,如果我删除它,我会得到一组String key =Integer.toString((Integer) rs.getObject(1));
没有问题。
//String query = "select RULEID, GRAPHRULE from GRAPHRULE3D WHERE GRAPHRULE LIKE '%1717-002%' AND GRAPHRULE NOT LIKE '%DRAWING%'"
public Map<String,String> getStrinfStringPairsFromIntegerStringSQL(String query) {
return processContent(query, (rs) -> {
Map<String,String> optionDescriptions = new TreeMap<>();
while (rs.next()) {
String key =Integer.toString((Integer) rs.getObject(1));
String value = rs.getString(rs.getString(2).trim());
optionDescriptions.put(key, value);
}
return optionDescriptions;
});
}
@FunctionalInterface
public static interface ResultSetHandler<S, T> {
Map<S, T> accept(ResultSet rs) throws SQLException;
}
public <S, T> Map<S, T> processContent(String query, ResultSetHandler handler) {
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
try (Connection con = DriverManager.getConnection(connectionUrl)) {
try (Statement stmt = con.createStatement()) {
try (ResultSet resultSet = stmt.executeQuery(query)) {
return handler.accept(resultSet);
}
}
}
} catch (SQLException e) {
throw new IllegalStateException("Unable to execute query: " + query, e);
} catch (ClassNotFoundException ex) {
Logger.getLogger(EngineSQLUtils.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
答案 0 :(得分:3)
您从结果集中获取一个值,并将其用作同一结果集中的列名。这不适用于您的查询。
如果您的结果集的值为1717-002
,则该行rs.getString(rs.getString(2).trim());
将展开为rs.getString("1717-002");
。你肯定不是那种意思吗?您只有列RULEID
和GRAPHRULE
。
答案 1 :(得分:1)
RULE
是SQL-server中的保留字,因此您的查询错误
如果可以的话,我建议更改列名,只是问题的根源
如果您不能,请尝试WHERE RULESET.RULE LIKE '%1717-002%'
或WHERE [RULE] LIKE '%1717-002%'