Java MySQL MBR包含抛出MySQLExceptionError的语句
我正在从事一个Java项目,我们使用它的sql库函数从MySQL服务器访问和查询 引发问题的代码是:Java MySQL MBR包含抛出MySQLExceptionError的语句,java,mysql,jdbc,spatial-query,Java,Mysql,Jdbc,Spatial Query,我正在从事一个Java项目,我们使用它的sql库函数从MySQL服务器访问和查询 引发问题的代码是: String setBox = "SET @box = 'Polygon((" + lx + " " + ry + "," + rx + " " + ry + ","
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”附近用户的正确语法。”
我不确定为什么会出现语法错误,因为我是基于以下原因得出的:
我的MySQL服务器版本是:5.5.40-0ubuntu0.14.04.1(Ubuntu)你的问题不在于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();
请注意,这可能不是它的工作方式。您可能需要更改某些内容,这是基本想法。我是从内存中执行此操作的,因此…您的问题不在于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();
请注意,这可能无法正常工作。您可能需要更改某些内容,这是基本的想法。我是从内存中执行此操作的,因此…我可以通过执行以下操作使其正常工作:
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");
我可以通过这样做来实现:
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");
如何定义此对象:
Polygon
?如何定义此对象:Polygon
?此方法现在已将语法错误移动到第一行“SET@box=…”。此方法现在已将语法错误移动到第一行“SET@box=…”。