Spring JPA使用@Embedded类时出现'字段列表中未知列'错误求助
解决Spring JPA查询时"Unknown column 'courier0_.coorx' in 'field list'"的问题
我来帮你一步步排查这个问题,从你提供的代码和错误信息来看,主要有几个关键点需要修正:
1. 实体类与可嵌入类缺少无参构造函数
JPA规范要求所有实体类和可嵌入类必须提供无参构造函数,Hibernate需要通过反射来实例化这些对象,没有无参构造会导致对象创建失败,进而引发映射相关的异常(比如无法正确识别嵌入式字段对应的数据库列)。
你需要给Courier和Location类添加无参构造:
// Courier类添加无参构造 @Entity public class Courier { // ... 现有字段 ... public Courier() {} // 添加这行 public Courier(int id, Location location, VehicleType vehicle, Status status) { // ... 现有构造实现 ... } } // Location类添加无参构造 @Embeddable public class Location { // ... 现有字段 ... public Location() {} // 添加这行 public Location(double coorx, double coory) { // ... 现有构造实现 ... } }
2. 修正schema.sql中的INSERT语句顺序错误
你的courier表定义的列顺序是id, vehicle, status, coorx, coory,但当前的INSERT语句参数顺序完全不匹配:
-- 错误的语句:参数顺序对应id, coorx, coory, vehicle, status INSERT INTO courier VALUES (1, 1, 1, 'CAR', 'IDLE');
这种错误会导致类型不匹配(比如把字符串'CAR'插入到double类型的coorx列),不仅无法正确插入测试数据,还可能导致数据库脚本执行失败,间接影响表结构。
修正后的INSERT语句应该严格匹配列顺序:
INSERT INTO courier VALUES (1, 'CAR', 'IDLE', 1.0, 1.0); INSERT INTO courier VALUES (2, 'MOTORCYCLE', 'DELIVERING', 13.0, 34.0);
3. 避免DROP TABLE语句导致脚本中断
如果vehicle表不存在,执行DROP TABLE vehicle会抛出SQL错误,导致后续的CREATE TABLE courier等语句无法执行,最终可能导致courier表没有被正确创建(还是旧的无coorx/coory列的结构)。
把DROP语句改为DROP TABLE IF EXISTS来兼容表不存在的情况:
DROP TABLE IF EXISTS courier; DROP TABLE IF EXISTS vehicle;
4. 可选:显式指定嵌入式字段的列名
虽然@Embedded和@Embeddable默认会映射到对应的列名,但显式添加@Column注解可以确保映射关系完全正确,避免因大小写或命名规则差异导致的问题:
@Embeddable public class Location { @Column(name = "coorx") private double coorx; @Column(name = "coory") private double coory; // ... 构造函数和getter/setter ... }
完成以上修正后,重新运行测试,应该就能正确查询到courier表中的数据了。
内容的提问来源于stack exchange,提问作者Juan Menéndez
相关产品推荐
相关产品推荐

