JDBC Template查询报错:Column 'categoryname' not found 求助排查
问题排查与解决方案
你的错误Column 'categoryname' not found其实很直观,核心问题出在数据查询范围和实体映射的不匹配上,我一步步给你拆解:
根本原因
- 你的SQL语句只查询了
products表(比如SELECT * FROM products WHERE ProductName = ?),但CategoryName字段并不在products表里——它属于categories表,products表只有关联用的CategoryID外键。 - 而你在
RowMapper里直接尝试从结果集读取rs.getString("CategoryName"),这相当于让数据库从products表找一个不存在的字段,自然会抛出错误。
分步修复方案
1. 修改SQL,关联查询两张表
要获取CategoryName,必须通过CategoryID关联products和categories表,把需要的字段查出来。修改后的SQL如下:
单条查询SQL
SELECT p.*, c.CategoryName FROM products p JOIN categories c ON p.CategoryID = c.CategoryID WHERE p.ProductName = ?
排序查询SQL
SELECT p.*, c.CategoryName FROM products p JOIN categories c ON p.CategoryID = c.CategoryID ORDER BY p.ProductName ASC
2. 修正RowMapper的映射逻辑
现在结果集里已经包含了CategoryName,可以正确映射到实体类了,同时注意完善Categories对象的初始化:
private static final RowMapper<Products> productsRowMapper = (rs, rowNum) ->{ Products products = new Products(); products.setProductid(rs.getLong("ProductID")); products.setProductname(rs.getString("ProductName")); products.setSupplierid(rs.getLong("SupplierID")); // 正确初始化Categories对象,填充从关联查询得到的字段 Categories category = new Categories(); category.setCategoryid(rs.getLong("CategoryID")); category.setCategoryname(rs.getString("CategoryName")); products.setCategoryid(category); products.setQuantityperunit(rs.getString("QuantityPerUnit")); products.setUnitprice(rs.getDouble("UnitPrice")); products.setUnitsinstock(rs.getLong("UnitsInStock")); products.setUnitsonorder(rs.getLong("UnitsOnOrder")); products.setReorderlevel(rs.getLong("ReorderLevel")); products.setDiscontinued(rs.getString("Discontinued")); return products; };
3. 优化实体类的关联映射(可选但推荐)
你的实体类命名和映射有一点小问题,建议调整得更符合规范:
Products类里的categoryid字段命名容易混淆,改成category更清晰,同时补充@JoinColumn指定外键:
@Entity public class Products { @Id private Long productid; @Column(name = "ProductName") private String productname; private Long supplierid; @ManyToOne @JoinColumn(name = "CategoryID") // 明确指定products表中的外键列 private Categories category; // 字段名改为category,更符合语义 // 其他字段、getter和setter... }
- 对应的
Categories类里的@OneToMany也要同步调整:
@Entity public class Categories { @Id private Long categoryid; @Column(name = "CategoryName") private String categoryname; private String description; private String picture; @OneToMany(mappedBy="category") // 对应Products里的category字段 private List<Products> products; // 其他字段、getter和setter... }
做完这些修改后,你的查询就能正确获取并映射CategoryName字段了。
内容的提问来源于stack exchange,提问作者jocom
相关产品推荐
相关产品推荐

