2016-11-01 6 views
1

Ich benutze NamedParameterJDBCTemplate in Spring und versuchen, nur wenige Spalten anstelle von allen Spalten auszuwählen. Aber ich habe einen Fehler - org.SpringFramework.BadSqlGrammarException.Wählen Sie ein paar Spalten mit NamedParameterJDBCTemplate

Meine DAO-Klasse hat den folgenden Code.

@Autowired 
private NamedParameterJdbcTemplate npjt; 

... // Some other code 

String query = "SELECT t.name AS NAME, t.city AS CITY FROM t WHERE t.country = :countryName"; 
MapSqlParameterSource param = new MapSqlParameterSource(); 
param.addValue("countryName", "GERMANY"); 
List<Person> pl = npjt.query(sql,param, new PersonMapper()); // Throws org.SpringFramework.BadSqlGrammarException 

Die Personenmodellklasse ist wie folgt.

public class Person { 
String name; 
String city; 
String country; 
String address; 

// All getters & setters 
} 

Die Mapper-Klasse ist wie folgt.

public class PersonMapper implements RowMapper { 

public Person mapRow(ResultSet rs, int rowNum) throws SQLException { 
    Person p = new Person(); 
    p.setName(rs.getString("NAME")); 
    p.setCity(rs.getString("CITY")); 
    return p; 
    } 

} 

Mit dem Fehler nur konfrontiert, wenn Sie ein paar Spalten auswählen. Wenn Sie eine Auswahl * treffen, funktionieren die Dinge gut.

+0

Könnten Sie auch der Frage die Ausgabe des Befehls hinzufügen: 'für (int i = 1; i <= rs.getMetaData(). GetColumnCount(); i ++) {System.out.println (rs.getMetaData(). GetColumnName (i));} '? Es kann Ihnen helfen, die Namen der Spalten zu identifizieren, mit denen Sie zu tun haben. Auch der Stacktrace der 'BadSqlGrammarException' kann hilfreich sein. –

+0

@marius_neo - Der Debug-Zeiger wird nicht in die mapRow-Funktion eingefügt. Es bricht hier ein, npjt.query (...), wo der SQL-Aufruf gemacht wird. –

+0

Ist der Tabellenname aus dem von Ihnen geposteten Beispielcode wirklich "t" oder fehlt der Tabellenname wirklich aus Ihrer Abfrage? –

Antwort

1

Ihre Abfrage sieht schlecht aus. Versuchen mit

String query = "SELECT t.name AS NAME, t.city AS CITY FROM Person t WHERE t.country =  :countryName"; 

Unter der Annahme, dass Ihre Tabelle/Klassenname ist 'Person'. Sonst ersetzen 'Person' mit dem guten Tabellennamen

+0

Der Tabellenname ist nicht derjenige, der das Problem verursacht. Aber sowieso guter Vorschlag. –

+0

Können Sie den Stack-Trace teilen? – chomnoue

Verwandte Themen