Java.sql.SQLException: 列未找到。

11
我收到了以下错误信息:

I am receiving the following error:

HTTP Status 500 - Request processing failed; nested exception is
org.springframework.jdbc.BadSqlGrammarException: StatementCallback; bad SQL grammar 
[SELECT id, name FROM track WHERE category_id = 1 ORDER BY name]; nested exception is
java.sql.SQLException: Column 'category_id' not found.

但是,当我将错误提示中列出的选择语句复制并粘贴到mysql shell中时,我得到了预期结果,因为表 track 具有列 category_id

造成此错误的原因是什么?

这是用于 track 的表创建语句:

CREATE TABLE track (
 id SERIAL
,name VARCHAR(50)
,category_id BIGINT UNSIGNED -- This references a serial (bigint unsigned)
,CONSTRAINT track_id_pk PRIMARY KEY (id)
,CONSTRAINT track_category_id_fk FOREIGN KEY
  (category_id) REFERENCES category (id)
);

这里是我 dao 类中关于 track 表的部分代码:

private static final class TrackMapper implements RowMapper<Track> {
    @Override
    public Track mapRow(ResultSet resultSet, int rowNum) throws SQLException {
        Track track = new Track();
        track.setId(resultSet.getInt("id"));
        track.setName(resultSet.getString("name"));
        track.setCategoryId(resultSet.getInt("category_id"));
        return track;
    }
}
public List<Track> getTracks(int categoryId) {
    String sql = "SELECT id, name FROM track WHERE category_id = " + categoryId + " ORDER BY name";
    return jdbcTemplate.query(sql, new TrackMapper());
}

很可能是数据类型的问题。尝试使用resultSet.getLong而不是getInt - Thomas
@Thomas,它仍然不起作用 :/. - Matthew Moisen
在我的情况下,我一直在单引号中指定我的参数,即* 不要这样做: "WHERE value = ':myvalue'" * - Janac Meena
1个回答

33

检查你的SQL语句--在列列表中需包括category_id:

String sql = "SELECT id, name, category_id FROM track WHERE category_id = " + categoryId + " ORDER BY name";

之所以失败是因为你试图从ResultSet中提取category_id,但它不存在。


1
当你在SQL语句中漏选了几列时,就会出现这个错误。 - prashanth-g

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接