2017-10-12 10 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의 워크 벤치 내에서 실행 할 수 있지만 생산에서이 오류가 발생합니다 :

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 컨테이너입니다. 또한 다른 많은 쿼리를 실행할 수 있습니다.이 쿼리는 문제를 일으 킵니다.

누구든지 내 간단한 실수를 지적하면 위대 할 것입니다. 또는이 문제를 더 잘 진단 할 수있는 방법을 아는 사람이라면 대단히 감사하겠습니다. 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

당신은 오류 코드를 잘못 실행했을 가능성이 큽니다. 즉 ** 자바 코드 **에 결함이 있습니다. 따라서 도움이 필요하면 1) 코드를 표시하고 2) 오류의 전체 스택 추적을 표시해야합니다. – Andreas

답변

1

일반적인 실수입니다.

ResultSet rs = ps.executeQuery(count); 

ps 같은

ResultSet rs = ps.executeQuery(); 

Statement가 연장되는 PreparedStatement이다이어야하며 executeQuery(String)은 불가능 명세서 방법이다.

비슷한 API를 만들려면 executeQuery(String)을 오버라이드하고 멋진 javadoc으로 @Deprecated으로 만드십시오.

+0

+10. 좋은 캐치. – spencer7593

0

물음표 ?이 그 진술의 맥락에서 무효가; MySQL은 이것을 숫자 리터럴, 문자열 리터럴 또는 유효한 참조로 보지 않습니다.

우리는이 같은 간단한 쿼리 실행 같은 오류가 발생할 수 있습니다

SELECT 'abc', 2, ?, NOW() 

을와 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는 질문에 자바 코드를 추가하기 전에이 답변이 을 게시했습니다

편집 할 수 있습니다. Joop Eggen의 답변에서 지적한 것처럼, 이것은 (지금 제공되는) OP 코드의 간단한 문제입니다 ... executeQuery 메서드에서 제공되는 매개 변수입니다. 준비된 진술을 위해 그렇게하지 마십시오.

+0

Prepared 문을 사용하고 있기 때문에 준비되지 않은 문을 인쇄하는 디버그 문에있는 코드가 실행될 때 물음표가 표시되지 않습니다. –

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";