JdbcTemplate
を使用して、データベースからBeanを取得しています。私の方法は次のとおりです。
public List<trackerv3Livedata> getTrackerData() {
return List<trackerv3Livedata> live = (List<trackerv3Livedata>) jdbcTemplate.queryForList("select * from mmitrackerv3_livedata where accountid =?",new Object[]{aid}, trackerv3Livedata.class);
}
また、trackerv3Livedata Beanの構造は次のとおりです。
public class trackerv3Livedata implements Serializable {
private static final long serialVersionUID = 2409168269491619888L;
private int deviceid;
private Long timestamp;
private Mmitrackerv3Device mmitrackerv3Device;
private Mmitrackerv3Account mmitrackerv3Account;
private double latitude;
private double longitude;
private Double altitude;
private Double speedkph;
private Double heading;
private Double gpssignal;
private Integer geozoneid;
private Double distancekm;
private Double gsmsignal;
private Double mainpower;
private Integer laststatustime;
private Double internalbattry;
private Double temperature;
private Short dinput1;
private Short dinput2;
private Short dinput3;
private Short dinput4;
private Short dinput5;
private Short dinput6;
private Short dinput7;
private Short dinput8;
private Short ainput1;
private Short ainput2;
private Short ainput3;
private Short ainput4;
private Short doutput1;
private Short doutput2;
private Short doutput3;
private Short doutput4;
/* There are Some Getter And Setter Method With Constructor */
}
私のシナリオでは、クエリにヒットしないようにすることは完全に可能であるため、私の質問は、次のエラーメッセージを回避する方法です。
org.springframework.jdbc.IncorrectResultSetColumnCountException: Incorrect column count: expected 1, actual 38
例外をスローするのではなく、nullを返すだけでよいように思えます。どうすれば修正できますか?前もって感謝します。
これは、使用したqueryForListメソッドが複数の列をサポートしないためです。 JdbcTemplateのqueryForListの実装を参照してください
public <T> List<T> More ...queryForList(String sql, Object[] args, Class<T> elementType) throws DataAccessException
{
return query(sql, args, getSingleColumnRowMapper(elementType));
}
GetsingleColumnRowMapper()メソッドは、単一の列から結果オブジェクトを読み取るための新しいRowMapperを作成します。代わりに、次の方法を使用できます。
public <T> List<T> query(String sql, Object[] args, RowMapper<T> rowMapper) throws DataAccessException
{
return query(sql, args, new RowMapperResultSetExtractor<T>(rowMapper));
}
JdbcTemplateメソッド
queryForList(String sql, Class<T> elementType)
one-column-queriesに便利です。列タイプのみ指定できます。 ResultSetに複数の列が必要な場合は、使用する方がより正確です
query(String sql, RowMapper<T> rowMapper)
rowMapperの実装として、独自のものを使用するか、または
jdbcTemplate.query(sql, new BeanPropertyRowMapper<T>(clazz));
あなたの場合、次のようになります。
public List<Trackerv3Livedata> getTrackerData() {
String sql = "SELECT * FROM mmitrackerv3_livedata mlive " +
"JOIN mmitrackerv3_device mdevice ON mlive.accountid = " +
"mdevice.accountid WHERE mlive.accountid = " + aid;
return jdbcTemplate.query(sql,
new BeanPropertyRowMapper<Trackerv3Livedata>(Trackerv3Livedata.class));
}
Bean RowMapper Interfaceとmaprow関数を実装すると、この問題が解決します
public class Mmitrackerv3LivedataMapper implements RowMapper<Mmitrackerv3Livedata> {
@Override
public Mmitrackerv3Livedata mapRow(ResultSet rs, int rowNum)
throws SQLException {
}
そして今、私はJDBCテンプレートに変更があります
List<Mmitrackerv3Livedata> live = jdbcTemplate.query("select * from mmitrackerv3_livedata mlive " +
"join mmitrackerv3_device mdevice on mlive.accountid = mdevice.accountid where mlive.accountid = " +
aid, new Mmitrackerv3LivedataMapper());
ありがとう@abhishek