2016-03-01 57 views
0

需要解決的問題:我試圖根據@RequestMapping API調用中給出的參數來查詢數據庫。如何使用Spring 4 MVC PathVariable參數查詢數據庫


海賊王,我面對錯誤,我當前的代碼:

@RequestMapping(value ="/{serialNumber}", method = RequestMethod.GET) 
    @ResponseBody 
    public void searchByStudent(@PathVariable("serialNumber") String serialNumber) { 
     SqlRowSet resultSet = this.jdbcTemplate.queryForRowSet("SELECT * FROM STORE_ITEMS WHERE SERIALNUMBER = :serialNumber"); 
     System.out.println(resultSet); 
    } 

這是錯誤通過郵差訪問URL時(瀏覽器)我得到:

HTTP Status 500 - Request processing failed; nested exception is org.springframework.jdbc.BadSqlGrammarException: StatementCallback; bad SQL grammar [SELECT * FROM STORE_ITEMS WHERE SERIALNUMBER = :serialNumber]; nested exception is java.sql.SQLSyntaxErrorException: [Vertica][VJDBC](4856) ERROR: Syntax error at or near ":" 

type Exception report 

message Request processing failed; nested exception is org.springframework.jdbc.BadSqlGrammarException: StatementCallback; bad SQL grammar [SELECT * FROM STORE_ITEMS WHERE SERIALNUMBER = :serialNumber]; nested exception is java.sql.SQLSyntaxErrorException: [Vertica][VJDBC](4856) ERROR: Syntax error at or near ":" 

description The server encountered an internal error that prevented it from fulfilling this request. 

exception 

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.jdbc.BadSqlGrammarException: StatementCallback; bad SQL grammar [SELECT * FROM STORE_ITEMS WHERE SERIALNUMBER = :serialNumber]; nested exception is java.sql.SQLSyntaxErrorException: [Vertica][VJDBC](4856) ERROR: Syntax error at or near ":" 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982) 
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:620) 
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
root cause 

org.springframework.jdbc.BadSqlGrammarException: StatementCallback; bad SQL grammar [SELECT * FROM STORE_ITEMS WHERE SERIALNUMBER = :serialNumber]; nested exception is java.sql.SQLSyntaxErrorException: [Vertica][VJDBC](4856) ERROR: Syntax error at or near ":" 
    org.springframework.jdbc.support.SQLExceptionSubclassTranslator.doTranslate(SQLExceptionSubclassTranslator.java:91) 
    org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73) 
    org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) 
    org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:415) 
    org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:470) 
    org.springframework.jdbc.core.JdbcTemplate.queryForRowSet(JdbcTemplate.java:511) 
    com.company.project.controller.DatabaseController.searchBySerialNumber(DatabaseController.java:64) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    java.lang.reflect.Method.invoke(Method.java:497) 
    org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:222) 
    org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) 
    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) 
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:814) 
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:737) 
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) 
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) 
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:620) 
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
root cause 

java.sql.SQLSyntaxErrorException: [Vertica][VJDBC](4856) ERROR: Syntax error at or near ":" 
    com.vertica.util.ServerErrorData.buildException(Unknown Source) 
    com.vertica.dataengine.VDataEngine.prepareImpl(Unknown Source) 
    com.vertica.dataengine.VDataEngine.prepare(Unknown Source) 
    com.vertica.dataengine.VDataEngine.prepare(Unknown Source) 
    com.vertica.jdbc.common.SStatement.executeNoParams(Unknown Source) 
    com.vertica.jdbc.common.SStatement.executeQuery(Unknown Source) 
    org.springframework.jdbc.core.JdbcTemplate$1QueryStatementCallback.doInStatement(JdbcTemplate.java:454) 
    org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:404) 
    org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:470) 
    org.springframework.jdbc.core.JdbcTemplate.queryForRowSet(JdbcTemplate.java:511) 
    com.company.project.controller.DatabaseController.searchBySerialNumber(DatabaseController.java:64) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    java.lang.reflect.Method.invoke(Method.java:497) 
    org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:222) 
    org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) 
    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) 
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:814) 
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:737) 
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) 
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) 
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:620) 
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
root cause 

com.vertica.support.exceptions.SyntaxErrorException: [Vertica][VJDBC](4856) ERROR: Syntax error at or near ":" 
    com.vertica.util.ServerErrorData.buildException(Unknown Source) 
    com.vertica.dataengine.VDataEngine.prepareImpl(Unknown Source) 
    com.vertica.dataengine.VDataEngine.prepare(Unknown Source) 
    com.vertica.dataengine.VDataEngine.prepare(Unknown Source) 
    com.vertica.jdbc.common.SStatement.executeNoParams(Unknown Source) 
    com.vertica.jdbc.common.SStatement.executeQuery(Unknown Source) 
    org.springframework.jdbc.core.JdbcTemplate$1QueryStatementCallback.doInStatement(JdbcTemplate.java:454) 
    org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:404) 
    org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:470) 
    org.springframework.jdbc.core.JdbcTemplate.queryForRowSet(JdbcTemplate.java:511) 
    com.company.project.controller.DatabaseController.searchBySerialNumber(DatabaseController.java:64) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    java.lang.reflect.Method.invoke(Method.java:497) 
    org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:222) 
    org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) 
    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) 
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:814) 
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:737) 
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) 
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) 
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:620) 
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.52 logs. 

使用

  • 數據庫:我的輸出控制檯中

    錯誤:

    INFO: SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase, Hana] 
    

    其他信息Vertica的(我不知道這可能是問題的基礎在輸出控制檯上)

  • resultSet將包含大約5個數字的對象

問:我怎麼能解決這個問題?我知道這不是最安全的查詢方式,但我試圖確保我的邏輯先行。此外,是否有可能更好的方式來使用jdbcTemplate進行查詢?

回答

0

您正試圖調用創建簡單的Statement而不是PreparedStatement的方法,但您正嘗試使用參數。

根據JavaDoc

執行查詢的SqlRowSet,由於靜態SQL。

使用JDBC語句,而不是PreparedStatement。如果要使用PreparedStatement執行靜態查詢,請使用重載的queryForRowSet方法,並將null作爲參數數組。

我從來沒有真的用這種方式來查詢數據庫。正如你所說,這可能不是最安全的方式,更不用說最舒服的了。但嘗試使用超載queryForRowSet方法

@RequestMapping(value ="/{serialNumber}", method = RequestMethod.GET) 
@ResponseBody 
public void searchByStudent(@PathVariable("serialNumber") String serialNumber) { 
    SqlRowSet resultSet = this.jdbcTemplate.queryForRowSet("SELECT * FROM STORE_ITEMS WHERE SERIALNUMBER = ?", new Object[] {serialNumber}); 
    System.out.println(resultSet); 
}