2017-10-12 103 views
-3
問題

SQL查詢:SQL查詢執行MySQL工作臺,但不是在生產

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.access$100(AnnotatedEndpoint.java:87) 
at org.glassfish.tyrus.core.AnnotatedEndpoint$WholeHandler$1.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$9.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.access$100(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)]] 
+0

你在哪裏設置參數? –

+1

您很可能錯誤地執行了查詢,即您的** Java代碼**有缺陷,因此如果您需要我們的幫助,您需要1)顯示代碼,並且2)顯示錯誤的完整堆棧跟蹤。 – Andreas

回答

1

一個典型的錯誤。

ResultSet rs = ps.executeQuery(count); 

應該是

ResultSet rs = ps.executeQuery(); 

作爲ps是延伸Statement一個PreparedStatement,和executeQuery(String)是不可用的聲明方法。

應該有人創建一個類似的API,覆蓋executeQuery(String)並使其具有良好的javadoc的@Deprecated

+0

+10。接得好。 – spencer7593

0

問號?是該聲明的情況下無效; MySQL不會將它看作數字文字,字符串文字或有效的引用。

我們也會導致同樣的錯誤運行這樣一個簡單的查詢:

和MySQL返回此錯誤:

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方法中提供。不要爲準備好的聲明做到這一點。

+0

由於我正在使用預準備語句,因此只有在打印無準備語句的調試語句中執行代碼時,問號纔出現。 –

0

嘗試在=和?之間添加一個空格。

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"; 
相關問題