2013-04-11 142 views
1

我有以下SQL查询:SQL查询工作在phpMyAdmin,但没有在Java中

SELECT `Activity`.`userid` , `Goal`.`goalid` , `Goal`.`activityid` , `Goal`.`exercise` , `Exercise`.`name` , `Goal`.`target` , `ActivityData`.`dataid` , `ActivityData`.`current` , MAX(`ActivityData`.`timestamp`) AS `timestamp` 
FROM `Goal` 
INNER JOIN `Activity` ON `Activity`.`activityid` = `Goal`.`activityid` 
INNER JOIN `Exercise` ON `Exercise`.`exerciseid` = `Goal`.`exercise` 
INNER JOIN `ActivityData` ON `ActivityData`.`activityid` = `Goal`.`activityid` 
WHERE `Activity`.`userid` =100005545413982 
GROUP BY `gymbuddy`.`Goal`.`activityid`; 

上面的查询工作在phpMyAdmin的,但给我,当我与一个PreparedStatement运行下面的堆栈跟踪。

com.mysql.jdbc.exceptions.jdbc4.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 'BY `gymbuddy`.`Goal`.`activityid`' at line 1 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 
    at com.mysql.jdbc.Util.getInstance(Util.java:386) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1053) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4096) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4028) 
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2490) 
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651) 
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2734) 
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155) 
    at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2322) 
    at com.mathanv.gb.dao.BuddyDao.getAllBuddyGoals(BuddyDao.java:387) 
    at com.mathanv.gb.controller.BuddyController.doPost(BuddyController.java:95) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) 
    at java.lang.Thread.run(Thread.java:680) 

这些都是DB属性:

driver=com.mysql.jdbc.Driver 
url=jdbc:mysql://localhost:8889/gymbuddy?allowMultiQueries=true 

不知道为什么它这样做!帮帮我!

编辑:我正在使用preparedStatement生成用户标识。

WHERE `gymbuddy`.`Activity`.`userid` =? 
ps.setLong(1, buddy.getUserID()); 

编辑:(请求)与PreparedStatement的方法。

public JSONObject getAllBuddyGoals(Buddy buddy){ 
     try { 
      PreparedStatement ps = connection.prepareStatement(GET_ALL_BUDDY_GOALS); 
      ps.setLong(1, buddy.getUserID()); 
      JSONObject response = new JSONObject(); 
      response.put("action", "getAllBuddyGoals"); 
      response.put("success", 1); 
      response.put("error", 0); 
      response.put("userid", buddy.getUserID()); 
      JSONArray goals = new JSONArray(); 
      ResultSet rs = ps.executeQuery(); 
      while(rs.next()){ 
       JSONObject goal = new JSONObject(); 
       goal.put("goalid", rs.getLong("goalid")); 
       goal.put("activityid", rs.getLong("activityid")); 
       goal.put("exercise", rs.getString("name")); 
       goal.put("target", rs.getDouble("target")); 
       goal.put("max", rs.getDouble("current")); 
       goals.add(goal); 
      } 
      response.put("goals", goals); 
      return response; 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
     JSONObject error = new JSONObject(); 
     error.put("action", "getAllBuddyGoals"); 
     error.put("success", 0); 
     error.put("error", 1); 
     error.put("error_msg", "error processing request, please contact admin."); 
     return error; 
    } 
+0

'buddy.getUserID()'返回什么? – cheesemacfly 2013-04-11 16:54:49

+0

例如很长的数字,100005545413982 – MathanMV 2013-04-11 16:55:33

+0

你能告诉我们准备好的语句的整个代码吗? – cheesemacfly 2013-04-11 16:59:18

回答

3

您可能想要检查buddy id值和术语Group之间是否存在实际空格。如果您阅读由Java引发的错误:

com.mysql.jdbc.exceptions.jdbc4.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 'BY `gymbuddy`.`Goal`.`activityid`' at line 1 

Mysql错误通常发生在错误说的位置之前。我的猜测是,您正在执行的查询缺少100005545413982和GROUP之间的某些空格,可能是这样的:

WHERE `Activity`.`userid` =100005545413982GROUP BY `gymbuddy`.`Goal`.`activityid`; 
+0

我只是打了一巴掌。不能相信一个小空间会浪费很多时间哈哈!非常感谢! – MathanMV 2013-04-11 17:06:48

+0

在那里,做到了。很高兴它的工作。 – Robbert 2013-04-11 17:09:55

相关问题