【问题标题】:SQL Feature Not Supported ExcpetionSQL 功能不支持异常
【发布时间】:2017-03-18 16:01:23
【问题描述】:

我不断收到功能不受支持的异常,代码如下:

public Collection<Product> getProds(String col, String prod) {
    LinkedList<Product> list = new LinkedList<>();
    try {
        String query = "SELECT * FROM Product where ? LIKE ?";
        PreparedStatement ps = con.prepareStatement(query);
        ps.setString(1, col);
        ps.setString(1, prod);
        ResultSet rs = ps.executeQuery(query);
        while ( rs.next() ) {
            Product product = new Product(
                    rs.getString("PID"),
                    rs.getString("Artist"),
                    rs.getString("Title"),
                    rs.getString("Description"),
                    rs.getInt("price"),
                    rs.getString("thumbnail"),
                    rs.getString("fullimage")
            );
            list.add( product );
        }
        return list;
    }
    catch(Exception e) {
        System.out.println( "Exception in getProducts(): " + e );
        return null;
    }
}

我猜它与 executeQuery 有关。非常感谢任何帮助

【问题讨论】:

    标签: java mysql exception prepared-statement


    【解决方案1】:

    PreparedStatement的setString方法不能设置列名,只能设置参数。

    如果不知道列名,可以使用Java String的replace方法在创建PreparedStatement之前指定列名,例如:

    String query = "SELECT * FROM Product where <column> LIKE ?";
    query = query.replaceAll("<column>", col);
    
    PreparedStatement ps = con.prepareStatement(query);
    ps.setString(1, prod);
    ResultSet rs = ps.executeQuery();
    

    【讨论】:

    • 这给了我一个意想不到的令牌:
    • 好吧,我已经更新了答案。其实应该是query = query.replaceAll("&lt;column&gt;", col);
    • 如果您可以在最后删除 executeQuery 中的“查询”,那么我也会因为该位需要更改:)
    • 完成,我相信这只是一个复制粘贴错字。
    【解决方案2】:

    我不熟悉 PreparedStatements,但也许你必须这样做:

        ps.setString(1, col);
        ps.setString(2, prod);
    

    以便您定义要设置的参数。也许您此时将第一个参数设置了两次,而没有设置第二个参数。在这个例子中http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html 他们是这样做的。

    您也不需要将查询作为参数传递给方法executeQuery(),因为它会覆盖已知的查询。

    【讨论】:

    • 哦,这是我没看到的问题哈哈!不幸的是仍然遇到同样的问题
    • 您确定必须将查询作为参数提供给 executeQuery 方法吗?请尝试不使用此参数。 PreparedStatement 已经知道您的查询。也许您正在搜索知道两者的查询?因为你覆盖了查询。
    • 就是这样!非常感谢,如果您想编辑您的答案,我可以将其标记为已解决
    • 我编辑了我的答案。如果您将其标记为解决方案,那就太好了。谢谢!
    猜你喜欢
    • 2015-10-02
    • 2011-04-15
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    相关资源
    最近更新 更多