2011-03-04 386 views
0

我正在使用HSQLDB作为我的数据库。我想获得最新插入行的主键。因为我已经在我的java类返回一个查询如下:如何解决org.springframework.jdbc.BadSqlGrammarException:PreparedStatementCallback;

final String query = "INSERT INTO polling_log (start_date,status,action) VALUES(CURRENT_TIMESTAMP,?,?); CALL IDENTITY();"; 
    GeneratedKeyHolder generatedKeyHolder = new GeneratedKeyHolder(); 
    int update = adapterJdbcTemplate.update(new PreparedStatementCreator() { 
     @Override 
     public PreparedStatement createPreparedStatement(
       Connection connection) throws SQLException { 

      PreparedStatement preparedStatement = connection 
        .prepareStatement(query); 
      preparedStatement.setInt(1, pollingLogVO.getStatus()); 
      preparedStatement.setString(2, pollingLogVO.getAction()); 
      System.out.println(preparedStatement.getGeneratedKeys().getFetchSize()); 
      return preparedStatement; 
     } 
    }, generatedKeyHolder); 

    System.out.println("###################### "+ update); 

    Number logId = generatedKeyHolder.getKey(); 
    pollingLogId = logId.intValue(); 

并存储我已经使用GeneratedKeyHolder的查询。但同时,这乳宁我得到一个异常:

org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar []; nested exception is java.sql.SQLException: unexpected token: IDENTITY 
    at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:98) 
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) 
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80) 
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:602) 
    at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:817) 
    at com.platysgroup.lmex.adapter.moodle.dao.LogDao.insertPollingLog(LogDao.java:36) 
    at com.platysgroup.lmex.adapter.MoodlePostingTask.insertPollingLog(MoodlePostingTask.java:134) 
    at com.platysgroup.lmex.adapter.MoodlePostingTask.run(MoodlePostingTask.java:55) 
    at java.util.TimerThread.mainLoop(Timer.java:512) 
    at java.util.TimerThread.run(Timer.java:462) 
Caused by: java.sql.SQLException: unexpected token: IDENTITY 
    at org.hsqldb.jdbc.Util.sqlException(Unknown Source) 
    at org.hsqldb.jdbc.JDBCPreparedStatement.<init>(Unknown Source) 
    at org.hsqldb.jdbc.JDBCConnection.prepareStatement(Unknown Source) 
    at org.apache.commons.dbcp.DelegatingConnection.prepareStatement(DelegatingConnection.java:248) 
    at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.prepareStatement(PoolingDataSource.java:302) 
    at com.platysgroup.lmex.adapter.moodle.dao.LogDao$1.createPreparedStatement(LogDao.java:41) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:580) 
    ... 6 more 
Caused by: org.hsqldb.HsqlException: unexpected token: IDENTITY 
    at org.hsqldb.error.Error.parseError(Unknown Source) 
    at org.hsqldb.ParserBase.unexpectedToken(Unknown Source) 
    at org.hsqldb.ParserCommand.compileStatement(Unknown Source) 
    at org.hsqldb.Session.compileStatement(Unknown Source) 
    at org.hsqldb.StatementManager.compile(Unknown Source) 
    at org.hsqldb.Session.execute(Unknown Source) 
    ... 12 more 
+0

@javanna:我看不到你的回答.. – jabal 2011-05-05 15:04:44

+0

@jabal - 那是因为他/她删除了它。 – 2012-05-12 05:27:11

回答

0

问题是与这条线(包装为清楚起见):

final String query = "INSERT INTO polling_log (start_date,status,action) VALUES(CURRENT_TIMESTAMP,?,?); CALL IDENTITY();";

的问题是, IDENTITY是SQL中的保留字;它已经有了一个预先定义的含义,所以不能像CALL语句那样使用。 (我不知道它的实际用途是什么; SQL的完整定义非常庞大,并且有很多保留字)。直接的解决方法是将问题单词用双引号括起来(这需要是反斜杠引用,因为在Java字符串)是:

final String query = "INSERT INTO polling_log (start_date,status,action) VALUES(CURRENT_TIMESTAMP,?,?); CALL \"IDENTITY\"();";

但是,如果你只是打电话,要得到插入的行,STOP!假设你有JDBC 3.0或更高版本(即Java 5或更高版本),让Spring为你完成这项工作。

+0

感谢唐纳德我尝试你的代码和它的工作正常。 – Chitresh 2012-05-21 04:15:10

0

据我知道你不能把一个以上的语句为一个字符串来执行。执行两个单独的操作,而不是这个。