SQL 查询在 MySql Workbench 中执行,但不在生产中
SQL query executes in MySql Workbench, but not in production
SQL 有问题的查询:
SELECT COUNT(suggestedfood.id) AS num_same, suggestedfood.place_id FROM suggestedfood WHERE suggestedfood.group_id=? AND suggestedfood.selected=? AND suggestedfood.removed=? GROUP BY suggestedfood.place_id LIMIT 1
此查询能够在 MySQL Workbench 内 运行,但在生产中它会抛出此错误:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '? AND suggestedfood.selected=? AND suggestedfood.removed=? GROUP BY suggestedfoo' at line 1
MySQL Error code: 1064
MySQL State: 42000
MySQL 服务器在 AWS RDS 上,如果有帮助的话,我的 运行 查询 SQL 的代码是 Glassfish 上的一个 Java 容器。许多其他查询也能够 运行,只是这个问题给我带来了麻烦。
如果有人能指出我的一个简单错误,那就太好了。或者,如果有人知道我如何更好地诊断这个问题,那将不胜感激。
编辑,这是我的 Java 代码,根据 group_id is a long
的要求
long numSame = 0L;
String count = "SELECT COUNT(" + SUGGESTEDFOOD_ID + ") AS num_same, "
+ SUGGESTEDFOOD_PLACEID + " FROM " + SUGGESTEDFOOD
+ " WHERE " + SUGGESTEDFOOD_GROUP_ID + "=? AND "
+ SUGGESTEDFOOD_SELECTED + "=? AND "
+ SUGGESTEDFOOD_REMOVED + "=? "
+ "GROUP BY "
+ SUGGESTEDFOOD_PLACEID + " LIMIT 1";
PreparedStatement ps = conn.connection.prepareStatement(count);
ps.setLong(1, group_id);
ps.setBoolean(2, true);
ps.setBoolean(3, false);
/* Line 607 */ ResultSet rs = ps.executeQuery(count);
while (rs.next()) {
numSame = rs.getLong("num_same");
}
这是完整的堆栈跟踪:
com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '? AND suggestedfood.selected=? AND suggestedfood.Removed=? GROUP BY suggestedfoo' at line 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:936)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2985)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1631)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3277)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3206)
at com.mysql.jdbc.Statement.executeQuery(Statement.java:1232)
at com.cow10.endpoints.FoodSessionHandler.togglePlace(FoodSessionHandler.java:607)
at com.cow10.endpoints.FoodSessionHandler$Proxy$_$$_WeldClientProxy.togglePlace(Unknown Source)
at com.cow10.endpoints.FoodWebSocket.handleMessage(FoodWebSocket.java:91)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.glassfish.tyrus.core.AnnotatedEndpoint.callMethod(AnnotatedEndpoint.java:477)
at org.glassfish.tyrus.core.AnnotatedEndpoint.access0(AnnotatedEndpoint.java:87)
at org.glassfish.tyrus.core.AnnotatedEndpoint$WholeHandler.onMessage(AnnotatedEndpoint.java:573)
at org.glassfish.tyrus.core.TyrusSession.notifyMessageHandlers(TyrusSession.java:542)
at org.glassfish.tyrus.core.TyrusEndpointWrapper.onMessage(TyrusEndpointWrapper.java:748)
at org.glassfish.tyrus.core.TyrusWebSocket.onMessage(TyrusWebSocket.java:200)
at org.glassfish.tyrus.core.frame.TextFrame.respond(TextFrame.java:135)
at org.glassfish.tyrus.core.ProtocolHandler.process(ProtocolHandler.java:622)
at org.glassfish.tyrus.core.TyrusWebSocketEngine$TyrusReadHandler.handle(TyrusWebSocketEngine.java:394)
at org.glassfish.tyrus.servlet.TyrusHttpUpgradeHandler.onDataAvailable(TyrusHttpUpgradeHandler.java:164)
at org.apache.catalina.connector.InputBuffer$ReadHandlerImpl.processDataAvailable(InputBuffer.java:488)
at org.apache.catalina.connector.InputBuffer$ReadHandlerImpl.onDataAvailable(InputBuffer.java:453)
at org.glassfish.grizzly.http.io.InputBuffer.invokeHandler(InputBuffer.java:1101)
at org.glassfish.grizzly.http.io.InputBuffer.invokeHandlerOnProperThread(InputBuffer.java:1092)
at org.glassfish.grizzly.http.io.InputBuffer.append(InputBuffer.java:975)
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:271)
at org.glassfish.grizzly.filterchain.ExecutorResolver.execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:561)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access0(WorkerThreadIOStrategy.java:56)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:565)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:545)
at java.lang.Thread.run(Thread.java:748)]]
问号 ?
在该语句的上下文中无效; MySQL 不会将其视为数字文字、字符串文字或有效引用。
我们可以导致同样的错误 运行 像这样的简单查询:
SELECT 'abc', 2, ?, NOW()
和MySQL returns这个错误:
Error Code: 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL
server version for the right syntax to use near '?, NOW()' at line 1
该问号字符可能是绑定变量的占位符。在没有看到实际代码的情况下,我们只是在猜测......我们希望看到 SQL 文本作为参数传递给 prepareStatement
,然后调用适当的方法将变量绑定到占位符,在执行之前,例如
PreparedSatement ps = con.prepareStatement(sqltext);
ps.setInt(1,groupId);
ps.setInt(2,selected);
ps.setInt(3,removed);
编辑
此答案已发布 之前 OP 在问题中添加了任何 Java 代码。正如 Joop Eggen 的回答所指出的那样,这是(现在提供的)OP 代码中的一个简单问题...... executeQuery
方法中提供的参数。不要对准备好的语句执行此操作。
尝试在 = 和 ? 之间添加一个 space。
String count = "SELECT COUNT(" + SUGGESTEDFOOD_ID + ") AS num_same, "
+ SUGGESTEDFOOD_PLACEID + " FROM " + SUGGESTEDFOOD
+ " WHERE " + SUGGESTEDFOOD_GROUP_ID + "= ? AND "
+ SUGGESTEDFOOD_SELECTED + "= ? AND "
+ SUGGESTEDFOOD_REMOVED + "= ? "
+ "GROUP BY "
+ SUGGESTEDFOOD_PLACEID + " LIMIT 1";
一个典型的错误。
ResultSet rs = ps.executeQuery(count);
应该是
ResultSet rs = ps.executeQuery();
因为ps
是PreparedStatement
扩展Statement
,而executeQuery(String)
是一个不可用的语句方法。
是否应该创建一个类似的 API,覆盖 executeQuery(String)
并使用漂亮的 javadoc 使其成为 @Deprecated
。
SQL 有问题的查询:
SELECT COUNT(suggestedfood.id) AS num_same, suggestedfood.place_id FROM suggestedfood WHERE suggestedfood.group_id=? AND suggestedfood.selected=? AND suggestedfood.removed=? GROUP BY suggestedfood.place_id LIMIT 1
此查询能够在 MySQL Workbench 内 运行,但在生产中它会抛出此错误:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '? AND suggestedfood.selected=? AND suggestedfood.removed=? GROUP BY suggestedfoo' at line 1
MySQL Error code: 1064
MySQL State: 42000
MySQL 服务器在 AWS RDS 上,如果有帮助的话,我的 运行 查询 SQL 的代码是 Glassfish 上的一个 Java 容器。许多其他查询也能够 运行,只是这个问题给我带来了麻烦。
如果有人能指出我的一个简单错误,那就太好了。或者,如果有人知道我如何更好地诊断这个问题,那将不胜感激。
编辑,这是我的 Java 代码,根据 group_id is a long
long numSame = 0L;
String count = "SELECT COUNT(" + SUGGESTEDFOOD_ID + ") AS num_same, "
+ SUGGESTEDFOOD_PLACEID + " FROM " + SUGGESTEDFOOD
+ " WHERE " + SUGGESTEDFOOD_GROUP_ID + "=? AND "
+ SUGGESTEDFOOD_SELECTED + "=? AND "
+ SUGGESTEDFOOD_REMOVED + "=? "
+ "GROUP BY "
+ SUGGESTEDFOOD_PLACEID + " LIMIT 1";
PreparedStatement ps = conn.connection.prepareStatement(count);
ps.setLong(1, group_id);
ps.setBoolean(2, true);
ps.setBoolean(3, false);
/* Line 607 */ ResultSet rs = ps.executeQuery(count);
while (rs.next()) {
numSame = rs.getLong("num_same");
}
这是完整的堆栈跟踪:
com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '? AND suggestedfood.selected=? AND suggestedfood.Removed=? GROUP BY suggestedfoo' at line 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:936)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2985)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1631)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3277)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3206)
at com.mysql.jdbc.Statement.executeQuery(Statement.java:1232)
at com.cow10.endpoints.FoodSessionHandler.togglePlace(FoodSessionHandler.java:607)
at com.cow10.endpoints.FoodSessionHandler$Proxy$_$$_WeldClientProxy.togglePlace(Unknown Source)
at com.cow10.endpoints.FoodWebSocket.handleMessage(FoodWebSocket.java:91)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.glassfish.tyrus.core.AnnotatedEndpoint.callMethod(AnnotatedEndpoint.java:477)
at org.glassfish.tyrus.core.AnnotatedEndpoint.access0(AnnotatedEndpoint.java:87)
at org.glassfish.tyrus.core.AnnotatedEndpoint$WholeHandler.onMessage(AnnotatedEndpoint.java:573)
at org.glassfish.tyrus.core.TyrusSession.notifyMessageHandlers(TyrusSession.java:542)
at org.glassfish.tyrus.core.TyrusEndpointWrapper.onMessage(TyrusEndpointWrapper.java:748)
at org.glassfish.tyrus.core.TyrusWebSocket.onMessage(TyrusWebSocket.java:200)
at org.glassfish.tyrus.core.frame.TextFrame.respond(TextFrame.java:135)
at org.glassfish.tyrus.core.ProtocolHandler.process(ProtocolHandler.java:622)
at org.glassfish.tyrus.core.TyrusWebSocketEngine$TyrusReadHandler.handle(TyrusWebSocketEngine.java:394)
at org.glassfish.tyrus.servlet.TyrusHttpUpgradeHandler.onDataAvailable(TyrusHttpUpgradeHandler.java:164)
at org.apache.catalina.connector.InputBuffer$ReadHandlerImpl.processDataAvailable(InputBuffer.java:488)
at org.apache.catalina.connector.InputBuffer$ReadHandlerImpl.onDataAvailable(InputBuffer.java:453)
at org.glassfish.grizzly.http.io.InputBuffer.invokeHandler(InputBuffer.java:1101)
at org.glassfish.grizzly.http.io.InputBuffer.invokeHandlerOnProperThread(InputBuffer.java:1092)
at org.glassfish.grizzly.http.io.InputBuffer.append(InputBuffer.java:975)
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:271)
at org.glassfish.grizzly.filterchain.ExecutorResolver.execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:561)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access0(WorkerThreadIOStrategy.java:56)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:565)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:545)
at java.lang.Thread.run(Thread.java:748)]]
问号 ?
在该语句的上下文中无效; MySQL 不会将其视为数字文字、字符串文字或有效引用。
我们可以导致同样的错误 运行 像这样的简单查询:
SELECT 'abc', 2, ?, NOW()
和MySQL returns这个错误:
Error Code: 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL
server version for the right syntax to use near '?, NOW()' at line 1
该问号字符可能是绑定变量的占位符。在没有看到实际代码的情况下,我们只是在猜测......我们希望看到 SQL 文本作为参数传递给 prepareStatement
,然后调用适当的方法将变量绑定到占位符,在执行之前,例如
PreparedSatement ps = con.prepareStatement(sqltext);
ps.setInt(1,groupId);
ps.setInt(2,selected);
ps.setInt(3,removed);
编辑
此答案已发布 之前 OP 在问题中添加了任何 Java 代码。正如 Joop Eggen 的回答所指出的那样,这是(现在提供的)OP 代码中的一个简单问题...... executeQuery
方法中提供的参数。不要对准备好的语句执行此操作。
尝试在 = 和 ? 之间添加一个 space。
String count = "SELECT COUNT(" + SUGGESTEDFOOD_ID + ") AS num_same, "
+ SUGGESTEDFOOD_PLACEID + " FROM " + SUGGESTEDFOOD
+ " WHERE " + SUGGESTEDFOOD_GROUP_ID + "= ? AND "
+ SUGGESTEDFOOD_SELECTED + "= ? AND "
+ SUGGESTEDFOOD_REMOVED + "= ? "
+ "GROUP BY "
+ SUGGESTEDFOOD_PLACEID + " LIMIT 1";
一个典型的错误。
ResultSet rs = ps.executeQuery(count);
应该是
ResultSet rs = ps.executeQuery();
因为ps
是PreparedStatement
扩展Statement
,而executeQuery(String)
是一个不可用的语句方法。
是否应该创建一个类似的 API,覆盖 executeQuery(String)
并使用漂亮的 javadoc 使其成为 @Deprecated
。