You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:53:24