2016-10-04 1 views
2

Spring JDBC шаблон не может выполнять запросы, содержащие вложенный запрос в ЕКЕSpring JDBC шаблон не может выполнять запросы, содержащие вложенный запрос в ЕКЕ

Я использую пружинный JdbcTemplate для выполнения запросов. И код использует SqlRowSet, а не RowMapper или RowExtractor.

Теперь возникает проблема при выполнении запроса, который содержит вложенный запрос в предложении FROM. Когда я тестирую запрос в Workbench или Mysql Console, он работает отлично.

Ниже приводится код

JdbcTemplate jdbcTemplate = new JdbcTemplate(txManager.getDataSource()); 
try { 
    String sqlQuery = "SELECT profile.user_profile_id, profile.user_id, profile.first_name " 
        + "FROM (SELECT user_profile_id, user_id, first_name FROM user_profile WHERE user_id = 1) AS profile"; 

    // The following line is throwing exception 
    SqlRowSet resultSet = jdbcTemplate.queryForRowSet(sqlQuery); 

    if (resultSet.next()) { 
      ...... // Put in a POJO 
    } 
} catch(DataAccessException e) { 
    e.printStackTrace(); 
    // Throw Proper User Defined Exception 
} 

Но, если я изменить запрос к следующему, он отлично работает.

String sqlQuery = "SELECT profile.user_profile_id, profile.user_id, profile.first_name " 
       + "FROM user_profile AS profile"; 

ПРИМЕЧАНИЕ: Мое имя базы данных титаны
Я получаю следующее исключение. В нем говорится, что таблица «титаны. *» Не существует. Мне кажется абсурдным.

org.springframework.jdbc.BadSqlGrammarException: StatementCallback; bad SQL grammar [SELECT prof.user_profile_id, prof.user_id, prof.first_name, prof.last_name FROM (SELECT inner_prof.user_profile_id, inner_prof.user_id, inner_prof.first_name, inner_prof.last_name FROM titans.user_profile AS inner_prof WHERE user_id = 1) AS prof ]; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'titans.*' doesn't exist 
at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:237) 
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) 
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:407) 
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:456) 
at org.springframework.jdbc.core.JdbcTemplate.queryForRowSet(JdbcTemplate.java:501) 
at com.titansinc.user.dsp.impl.UserDSP.getUserProfileByUserID(UserDSP.java:188) 
at com.titansinc.user.service.UserService.getUserProfileByUserID(UserService.java:36) 
at controllers.com.titans.play.controllers.Application.testReadMethod(Application.java:40) 
at Routes$$anonfun$routes$1$$anonfun$applyOrElse$6$$anonfun$apply$24.apply(routes_routing.scala:141) 
at Routes$$anonfun$routes$1$$anonfun$applyOrElse$6$$anonfun$apply$24.apply(routes_routing.scala:141) 
at play.core.Router$HandlerInvokerFactory$$anon$4.resultCall(Router.scala:264) 
at play.core.Router$HandlerInvokerFactory$JavaActionInvokerFactory$$anon$15$$anon$1.invocation(Router.scala:255) 
at play.core.j.JavaAction$$anon$1.call(JavaAction.scala:55) 
at play.GlobalSettings$1.call(GlobalSettings.java:67) 
at play.core.j.JavaAction$$anonfun$11.apply(JavaAction.scala:82) 
at play.core.j.JavaAction$$anonfun$11.apply(JavaAction.scala:82) 
at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24) 
at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24) 
at play.core.j.HttpExecutionContext$$anon$2.run(HttpExecutionContext.scala:40) 
at play.api.libs.iteratee.Execution$trampoline$.execute(Execution.scala:46) 
at play.core.j.HttpExecutionContext.execute(HttpExecutionContext.scala:32) 
at scala.concurrent.impl.Future$.apply(Future.scala:31) 
at scala.concurrent.Future$.apply(Future.scala:492) 
at play.core.j.JavaAction$class.apply(JavaAction.scala:82) 
at play.core.Router$HandlerInvokerFactory$JavaActionInvokerFactory$$anon$15$$anon$1.apply(Router.scala:252) 
at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4$$anonfun$apply$5.apply(Action.scala:130) 
at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4$$anonfun$apply$5.apply(Action.scala:130) 
at play.utils.Threads$.withContextClassLoader(Threads.scala:21) 
at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4.apply(Action.scala:129) 
at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4.apply(Action.scala:128) 
at scala.Option.map(Option.scala:145) 
at play.api.mvc.Action$$anonfun$apply$1.apply(Action.scala:128) 
at play.api.mvc.Action$$anonfun$apply$1.apply(Action.scala:121) 
at play.api.libs.iteratee.Iteratee$$anonfun$mapM$1.apply(Iteratee.scala:483) 
at play.api.libs.iteratee.Iteratee$$anonfun$mapM$1.apply(Iteratee.scala:483) 
at play.api.libs.iteratee.Iteratee$$anonfun$flatMapM$1.apply(Iteratee.scala:519) 
at play.api.libs.iteratee.Iteratee$$anonfun$flatMapM$1.apply(Iteratee.scala:519) 
at play.api.libs.iteratee.Iteratee$$anonfun$flatMap$1$$anonfun$apply$14.apply(Iteratee.scala:496) 
at play.api.libs.iteratee.Iteratee$$anonfun$flatMap$1$$anonfun$apply$14.apply(Iteratee.scala:496) 
at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24) 
at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24) 
at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:41) 
at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:393) 
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) 
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) 
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) 
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) 
    Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'titans.*' doesn't exist 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
at java.lang.reflect.Constructor.newInstance(Constructor.java:423) 
at com.mysql.jdbc.Util.handleNewInstance(Util.java:377) 
at com.mysql.jdbc.Util.getInstance(Util.java:360) 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:978) 
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3887) 
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3823) 
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2435) 
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2582) 
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2526) 
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2484) 
at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1446) 
at com.mysql.jdbc.Field.getCollation(Field.java:448) 
at com.mysql.jdbc.ResultSetMetaData.isCaseSensitive(ResultSetMetaData.java:549) 
at com.sun.rowset.CachedRowSetImpl.initMetaData(CachedRowSetImpl.java:722) 
at com.sun.rowset.CachedRowSetImpl.populate(CachedRowSetImpl.java:639) 
at org.springframework.jdbc.core.SqlRowSetResultSetExtractor.createSqlRowSet(SqlRowSetResultSetExtractor.java:79) 
at org.springframework.jdbc.core.SqlRowSetResultSetExtractor.extractData(SqlRowSetResultSetExtractor.java:62) 
at org.springframework.jdbc.core.SqlRowSetResultSetExtractor.extractData(SqlRowSetResultSetExtractor.java:45) 
at org.springframework.jdbc.core.JdbcTemplate$1QueryStatementCallback.doInStatement(JdbcTemplate.java:446) 
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:396) 
... 44 more 
+0

Вы все время проверяете в консоли sql весь свой запрос? – johnnynemonic

+0

да @johnnynemonic, он отлично работает в консоли и верстаке mysql. Проблема, похоже, связана с JDBCTemplate. –

+0

'MySQLSyntaxErrorException: Таблица 'titans. *' Не существует' Проверьте конфигурацию datasource jdbc. Он настроен на базу данных «титанов»? –

ответ

1

Похож на то, что queryForRowSet(sqlQuery) у метода есть эта ошибка. Я сообщил об ошибке на весне JIRA.

Альтернативный подход заключается в использовании ResultSetExtractor or RowMapper для реализации вызова db. Эта реализация не исключает исключений для вышеупомянутых запросов.

.... 

String sqlQuery = "....."; 
Object[] parameters = { .... }; 

ITestPOJO resultList = jdbcTemplate.query(sqlQuery, parameters, 
    new ResultSetExtractor<ITestPOJO>() { 

     @Override 
     public ITestPOJO extractData(ResultSet rs) throws SQLException, DataAccessException { 
      // TODO use ResultSet from here 
      // return ITestPOJO object 
     } 
    });   
... 
Смежные вопросы