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;
}