2012-09-04 59 views
3

我是越來越壞SQL語法例外JDBC春天

org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback;錯誤的SQL語法[select cid, 臨牀醫師代碼,密碼,名字,臨牀醫師的姓氏,其中 臨牀醫師代碼=?];嵌套的例外是 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:在「字段列表」

錯誤在下面的代碼未知 列「醫生」,你還可以看到表的屏幕截圖,除了CID所有其他屬性是VARCHAR(45)

Clinician Table

行映射類

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

回答

5

選擇數據爲了使用在列名破折號,你需要用後退標記來逃避它們。

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

謝謝了,異常消失了,但它仍然沒有返回查詢,雖然表中有數據 – MGD

4

我知道這是一個古老的線程,但希望任何人碰到這個問題的絆腳石會發現這個答案是有用的。

我在我的spring應用程序中遇到了同樣的異常。基於輸出,我認爲我的查詢語法問題。事實證明,我的映射器方法中實際上有一個語法錯誤。我遇到過這個問題,因爲我最初創建的產品類的字段名不同於列名。

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正確做到了這一點,但我認爲值得重申。我希望有人認爲這有幫助。

+0

是的,你是正確的,目前我面臨着同樣的問題,並在通過這篇文章之前,我想這是因爲發生,因爲的映射器。 – subhashis

+0

這正是我所遇到的問題。非常感謝! – Shane