有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java MySQL MBR包含抛出MySQLExceptionError的语句

我正在从事一个Java项目,我们使用它的sql库函数从MySQL服务器访问和查询

引发问题的代码是:

String setBox = "SET @box = 
                                'Polygon((" + lx + " " + ry + ","
                                            + rx + " " + ry + ","
                                            + lx + " " + ly + ","
                                            + rx + " " + ly + ","
                                            + lx + " " + ry + "))';\n";

ResultSet regionResult = stmt.executeQuery(setBox + 
  "SELECT ItemID FROM ItemPoint WHERE MBRContains(GeomFromText(@box), Coords);\n");

第二条语句(ResultSet regionResult=…)中出现错误

我收到的错误是:

“com.mysql.jdbc.exception.jdbc4.MySQLSyntaxErrorException:您的SQL语法有错误;请检查与您的mysql服务器版本相对应的手册,以了解第2行“从MBR包含((GeomFromText(@box),Coords)的ItemPoint中选择ItemID”附近用户的正确语法。”

我不确定为什么会出现语法错误,因为我是基于:http://dev.mysql.com/doc/refman/5.5/en/using-spatial-indexes.html

我的MySQL服务器版本是:5.5.40-0ubuntu0。14.04.1(Ubuntu)


共 (2) 个答案

  1. # 1 楼答案

    你的问题不是MySql,而是PreparedStatement。您不能使用它来运行这样的两个语句,您必须使用CallableStatement

    对于您的问题,它将类似于:

    String callString = "{ call SET @box = 'Polygon(( ? ?,
                                           ? ?,
                                           ? ?,
                                           ? ?,
                                           ? ?))'; 
                          SELECT ItemID 
                            FROM ItemPoint 
                           WHERE MBRContains(GeomFromText(@box), Coords); }";
    
    CallableStatement callableStatement = con.prepareCall(callString);
    callableStatement.setInt(1, lx);
    callableStatement.setInt(2, ry);
    callableStatement.setInt(3, rx);
    callableStatement.setInt(4, ry);
    callableStatement.setInt(5, lx);
    callableStatement.setInt(6, ly);
    callableStatement.setInt(7, rx);
    callableStatement.setInt(8, ly);
    callableStatement.setInt(9, lx);
    callableStatement.setInt(10, ry);
    ResultSet regionResult = callableStatement.executeQuery();
    

    请注意,这可能不是它的工作方式。你可能需要改变一些东西,这是基本的想法。我是凭记忆做的,所以

  2. # 2 楼答案

    我可以通过这样做来实现:

    String box = "Polygon((" 
                            + lx + " " + ry + ", "
                            + rx + " " + ry + ", "
                            + rx + " " + ly + ", "
                            + lx + " " + ly + ", "
                            + lx + " " + ry + "))";
    
    ResultSet regionResult = stmt.executeQuery(//setBox + 
      "SELECT ItemID FROM ItemPoint WHERE MBRContains(GeomFromText(' " + box +  " '), Coords);\n");