7

私は取得しています

org.springframework.jdbc.BadSqlGrammarException:PreparedStatementCallback; 不正なSQL文法[臨床医からcid、clinician-code、password、first-name、last-nameを選択します。ここでclinician-code =?]; ネストされた例外はcom.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorExceptionです:「フィールドリスト」の不明な列「臨床医」

次のコードでエラーが発生しました。他のすべての属性がVARCHAR(45)であるcidを除いて、スクリーンショットで表を確認することもできます。

臨床医テーブル

行マッパークラス

public class CClinicianRowMapper implements RowMapper {

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

}

ResultExtractorクラスpublicclassCClinicianResultSetExtractorは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;
}
4

3 に答える 3

13

これが古いスレッドであることは知っていますが、この質問に出くわした人がこの回答が役立つことを願っています。

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がこれを正しく行ったように見えますが、繰り返す価値があると思いました。誰かがこれがお役に立てば幸いです。

于 2016-03-23T13:50:24.207 に答える
8

列名にダッシュを使用するには、バックティックでそれらをエスケープする必要があります。

"SELECT cid, `clinician-code`, password, `first-name`, `last-name` 
     FROM Clinician 
     WHERE `clinician-code` = ?"
于 2012-09-04T20:46:40.990 に答える
0

クエリ構文を適切にチェックして、欠落していないか確認してください。または余分なコンマ(、)。「不正なSQL文法例外」は、SQLクエリの構文上の誤りにのみ関連しています。
Spring JDBCで作業しているときに、次のコードで同じエラーが発生していました。

String query= "update student set name=?, city=?, where id=?"; // due to extra comma after city=?,

コードをに変更しました

String query= "update student set name=? city=?, where id=?"; 

エラーが解決しました。

于 2021-12-09T18:09:07.447 に答える