代码之家  ›  专栏  ›  技术社区  ›  Stepan

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

  •  0
  • Stepan  · 技术社区  · 9 年前

    下面的方法从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 回复  |  直到 9 年前
        1
  •  3
  •   TT.    9 年前

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

    如果您的结果集 1717-002 rs.getString(rs.getString(2).trim()); 将扩展到 rs.getString("1717-002"); .你肯定不是那个意思吧?您只有列 RULEID 和 GRAPHRULE .

        2
  •  1
  •   Nir Levy    9 年前

    RULE
    如果可以,我建议更改列名,这只是一个问题源。
    如果不行,试试看 WHERE RULESET.RULE LIKE '%1717-002%' 或 WHERE [RULE] LIKE '%1717-002%'