java
  • mysql
  • jdbc
  • spatial-query
  • 2016-02-12 65 views 0 likes 
    0

    我工作的一个Java项目,在这里我们使用它的SQL库函数从MySQL服务器访问和查询。MySQL的MBRContains声明扔MySQLExceptionError

    引发此问题的代码是:

    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服务器版本正确的语法,靠近用户的“选择项ID FROM ItemPoint WHERE MBRContains((GeomFromText(手动@盒子),坐标)在第2行“

    我不知道为什么有一个语法错误,因为我立足其关闭:http://dev.mysql.com/doc/refman/5.5/en/using-spatial-indexes.html

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

    +0

    如何定义这个对象:'Polygon'? –

    回答

    1

    我能够让它做这个工作,而不是:

    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"); 
    
    +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(); 
    

    注意,这可能不工作事情是这样的。你可能需要改变一些东西,这是基本的想法。我从内存中这样做,所以...

    +0

    这种方法现在已经搬到了语法错误“SET @Box = ...”的第一道防线。 –

    相关问题