Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MySQL查询正确语法在JdbcTemplate中不起作用_Java_Mysql_Spring_Spring Jdbc - Fatal编程技术网

Java MySQL查询正确语法在JdbcTemplate中不起作用

Java MySQL查询正确语法在JdbcTemplate中不起作用,java,mysql,spring,spring-jdbc,Java,Mysql,Spring,Spring Jdbc,我正在使用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.town

我正在使用
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代码时,我得到了
badsqlgramarexception
。以下是我的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;
}
这是我的
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

请帮我找出问题所在。

我猜解析器对您在一条语句中使用的两条语句不满意。通常,您不应该执行
设置
并将所有参数添加到
字符串
。如果set语句不受支持,我不会感到惊讶


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

尝试将特定于搜索的查询更改为命名参数。并调用该方法适当的参数

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);
query=“从乡镇中选择T.*,D.divisionname作为T”+
“T.divisionid=D.divisionid上作为D的内部联接分区”+
其中T.townshipcode如CONCAT(“%”,:search,“%”)或+
T.townshipname,如CONCAT(“%”,:search,“%”)或+
“D.名称,如CONCAT('%,:search,'”)”+
“按T.townshipcode限制订购”+开始+“,”+页面显示长度;
Map queryParams=new HashMap();
queryParams.put(“搜索”,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;
}
受保护列表getMultiRecords(字符串查询,映射名参数){
List listResult=新建ArrayList();
if(namedParams!=null&&namedParams.size()>0){
listResult=jdbcTemplate.query(查询,namedParams,新的行映射器(){
@凌驾
public T mapRow(ResultSet rs,int rowNum)抛出SQLException{
T实体=读取记录(rs);
返回实体;
}
});
}否则{
listResult=jdbcTemplate.query(查询,新建行映射器(){
@凌驾
public T mapRow(ResultSet rs,int rowNum)抛出SQLException{
T实体=读取记录(rs);
返回实体;
}
});
}
返回列表结果;
}

我已经尝试了参数绑定。但是,它也不起作用。你应该发布“BadGrammarException”的错误文本,让我们知道错误发生的确切位置。您是否尝试省去了“T.*”通配符?对于测试,请删除集合并删除所有出现的带有“B”的“@search”,然后在它工作时将其更改为参数绑定。我在上面添加了Spring文档链接。参数绑定适用于普通字符。但是,当我尝试使用unicode字符搜索时,我得到了未分类的SQLException。
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;
}