【问题标题】:MySQL query correct syntax is not working in JdbcTemplateMySQL 查询正确的语法在 JdbcTemplate 中不起作用
【发布时间】:2015-04-26 05:51:03
【问题描述】:

我正在使用LIKE 关键字来查询具有单个搜索参数的表格。当我在 MySQL Workbench 中运行以下 sql 语句时,它按预期正常工作。

SET @search = 'B'; 
SELECT T.*,D.divisionname 
FROM Township AS T INNER JOIN Division AS D ON T.divisionid=D.divisionid 
WHERE T.townshipcode LIKE CONCAT('%', @search, '%') OR 
T.townshipname LIKE CONCAT('%', @search, '%') OR 
D.divisionname LIKE CONCAT('%', @search, '%') 
ORDER BY T.townshipcode LIMIT 0,10

但是,当我使用JdbcTemplate 执行我的java 代码时,我得到了BadSqlGrammarException。以下是我的java代码:

public List<Township> getList(Integer pageNumber, Integer pageDisplayLength, String searchParameter) {
    int start = ((pageNumber - 1) * pageDisplayLength);
    String query = "";
    if (null != searchParameter && !searchParameter.equals("")){

        query = "SET @search = '" + searchParameter + "'; " +
                "SELECT T.*,D.divisionname FROM Township AS T " +
                "INNER JOIN Division AS D ON T.divisionid=D.divisionid " +
                "WHERE T.townshipcode LIKE CONCAT('%', @search, '%') OR " +
                "T.townshipname LIKE CONCAT('%', @search, '%') OR " +
                "D.divisionname LIKE CONCAT('%', @search, '%') " +
                "ORDER BY T.townshipcode LIMIT " + start + "," + pageDisplayLength;                     
    }
    else{
        query = "SELECT T.*,D.divisionname FROM Township AS T " +
               "INNER JOIN Division AS D ON T.divisionid=D.divisionid ORDER BY T.townshipcode LIMIT " + start + "," + pageDisplayLength;
    }
    List<Township> townshipList = getMultiRecords(query);
    return townshipList;
}

以下是getMultiRecords 基类的方法:

protected List<T> getMultiRecords(String query){
    List<T> listResult = jdbcTemplate.query(query, new RowMapper<T>(){
        @Override 
        public T mapRow(ResultSet rs, int rowNum) throws SQLException {
            T entity = readRecord(rs);
            return entity;
        }
    });
    return listResult;
}

这是我的BadSqlGrammarException 详细信息。

Request processing failed; nested exception is org.springframework.jdbc.BadSqlGrammarException: StatementCallback; bad SQL grammar [SET @search = 'B'; SELECT T.*,D.divisionname FROM Township AS T INNER JOIN Division AS D ON T.divisionid=D.divisionid WHERE T.townshipcode LIKE CONCAT('%', @search, '%') OR T.townshipname LIKE CONCAT('%', @search, '%') OR D.divisionname LIKE CONCAT('%', @search, '%') ORDER BY T.townshipcode LIMIT 0,10]; nested exception is 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 'SELECT T.*,D.divisionname FROM Township AS T INNER JOIN Division AS D ON T.divis' at line 1

请帮我找出问题所在。

【问题讨论】:

    标签: java mysql spring spring-jdbc


    【解决方案1】:

    我猜解析器对您在一个语句中使用的两个语句不满意。通常不应使用SET 并将所有参数添加到String,而应使用parameter binding。如果 set 语句不受支持,我不会感到惊讶。

    您的语句也缺少结束分号。由于您缺少确切/完整的错误消息,这只是猜测。

    【讨论】:

    • 我已经尝试过参数绑定。但是,它也不起作用。
    • 您应该发布“BadGrammarException”的错误文本,并让我们知道错误发生在哪里。您是否尝试省略“T.*”通配符?
    • 为了测试移除集合并移除所有出现的“@search”和'B',当它工作时将其更改为参数绑定。我在上面添加了 Spring 文档链接。
    • 参数绑定适用于普通字符。但是,当我尝试使用 unicode 字符进行搜索时,我得到了未分类的 SQLException。
    【解决方案2】:

    尝试将搜索特定查询更改为命名参数。并调用相应的方法参数。

    query =   "SELECT T.*,D.divisionname FROM Township AS T " +
                    "INNER JOIN Division AS D ON T.divisionid=D.divisionid " +
                    "WHERE T.townshipcode LIKE CONCAT('%', :search, '%') OR " +
                    "T.townshipname LIKE CONCAT('%', :search, '%') OR " +
                    "D.divisionname LIKE CONCAT('%', :search, '%') " +
                    "ORDER BY T.townshipcode LIMIT " + start + "," + pageDisplayLength;  
    
    Map<String, Object> queryParams = new HashMap<>();
    queryParams.put("search", searchParameter);
    

    更新方法代码以接受命名参数。

    protected List<T> getMultiRecords(String query, Map<String,Object> namedParams){ 
        List<T> listResult = new ArrayList();
        if (namedParams != null && namedParams.size() > 0) {
            listResult = jdbcTemplate.query(query, namedParams ,new RowMapper<T>(){
                @Override 
                public T mapRow(ResultSet rs, int rowNum) throws SQLException {
                    T entity = readRecord(rs);
                    return entity;
                }
            });
        } else {
            listResult = jdbcTemplate.query(query ,new RowMapper<T>(){
                @Override 
                public T mapRow(ResultSet rs, int rowNum) throws SQLException {
                    T entity = readRecord(rs);
                    return entity;
                }
            });
        }
        return listResult;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-30
      • 2012-04-08
      • 2022-11-16
      相关资源
      最近更新 更多