我有以下SQL查询:
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运行时会给我以下stacktrace。
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)
这些是数据库属性:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:8889/gymbuddy?allowMultiQueries=true
不确定为什么这样做!帮助!
编辑:我正在使用preparedStatement生成用户ID。
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 :(得分:4)
您可能想要检查好友ID值和术语组之间是否存在实际空格。如果您阅读了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`;