JDBC spring 中的 Bad Sql Grammar 异常

新手上路,请多包涵

我是得到

org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback;错误的 SQL 语法 [从临床医生那里选择 cid、临床医生代码、密码、名字、姓氏,其中临床医生代码 = ?];嵌套异常是 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column ‘clinician’ in ‘field list’

以下代码出错,您还可以在屏幕截图中看到表格,除了 cid 所有其他属性都是 VARCHAR(45)

临床医生表

行映射器类

public class CClinicianRowMapper implements RowMapper {

@Override
public Object mapRow(ResultSet rs, int line) throws SQLException {
    CClinicianResultSetExtractor extractor = new CClinicianResultSetExtractor();
    return extractor.extractData(rs);
}

}

结果提取器类公共类 CClinicianResultSetExtractor 实现 ResultSetExtractor {

   @Override
  public Object extractData(ResultSet rs) throws SQLException {
    CClinician clinician = new CClinician();
    clinician.setCid(rs.getLong("cid"));
    clinician.setClinicianCode(rs.getString("clinician-code"));
    clinician.setPassword(rs.getString("password"));
    clinician.setFirstName(rs.getString("first-name"));
    return clinician;
  }

}

从表中选择数据的类

public List<CClinician> findClinician(CClinician _clinician) {
    // TODO Auto-generated method stub
    JdbcTemplate select = new JdbcTemplate(dataSource);
    try
    {
    return select.query("select cid, clinician-code, password, first-name, last-name from Clinician where clinician-code= ?",
            new Object[] {_clinician.getClinicianCode()}, new CClinicianRowMapper());

    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
    return null;
}

原文由 MGD 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
2 个回答

为了在列名中使用破折号,您需要使用反引号将它们转义。

 "SELECT cid, `clinician-code`, password, `first-name`, `last-name`
     FROM Clinician
     WHERE `clinician-code` = ?"

原文由 Joe Stefanelli 发布,翻译遵循 CC BY-SA 3.0 许可协议

我知道这是一个旧线程,但希望遇到这个问题的任何人都会发现这个答案很有用。

我在我的 spring 应用程序中遇到了同样的异常。根据输出,我认为我的查询存在语法问题。事实证明,我的映射器方法实际上存在语法错误。我遇到这个问题是因为我最初创建的 Product 类的字段名称与列名称不同。

 public class ProductMapper implements RowMapper<Product> {
public Product mapRow(ResultSet rs, int rowNum) throws SQLException {
  Product product = new Product();
  product.setProduct_id(rs.getInt("product_id"));  //was id.  was causing BadSqlGrammarException
  product.setProduct_name(rs.getString("product_name")); //was name.  was causing BadSqlGrammarException
  product.setPrice(rs.getDouble("price"));
  product.setQuantity(rs.getInt("quantity"));
  return product;
   }
}

进行上述更改后(我的字段命名为 product_id 和 product_name),我的应用程序正常运行。请记住,您对列名或 java 字段所做的任何更改不仅应该对您的查询语句进行,而且还应该对您的映射器方法进行。我看到 OP 正确地做到了这一点,但我认为值得重申。我希望有人觉得这有帮助。

原文由 jeffkempf 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题