SQL响应被视为列名,而不是Java中的内容

时间:2016-11-11 17:41:21

标签: java sql sql-server exception

下面的方法从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;
}

2 个答案:

答案 0 :(得分:3)

您从结果集中获取一个值,并将其用作同一结果集中的列名。这不适用于您的查询。

如果您的结果集的值为1717-002,则该行rs.getString(rs.getString(2).trim());将展开为rs.getString("1717-002");。你肯定不是那种意思吗?您只有列RULEIDGRAPHRULE

答案 1 :(得分:1)

RULE是SQL-server中的保留字,因此您的查询错误 如果可以的话,我建议更改列名,只是问题的根源 如果您不能,请尝试WHERE RULESET.RULE LIKE '%1717-002%'WHERE [RULE] LIKE '%1717-002%'