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

Hibernate多对一VARCHAR字段调用getLong()报无效值错误

问题分析与解决

这个错误Invalid value for getLong() - 'INDUSTRYTYPE'的核心原因是Hibernate尝试将字符串值INDUSTRYTYPE转换为Long类型时失败,本质是实体关联的字段类型或配置不匹配,具体排查方向如下:

1. 主键与外键的类型不匹配

  • 检查父类DescriptionBase中定义的主键类型:如果Field的主键(继承自DescriptionBase)是Long类型,那么PROFESSION表的FIELDNAME字段应该存储数值类型的主键值,但当前该字段存储的是字符串INDUSTRYTYPE,导致Hibernate无法完成类型转换。
  • 解决:要么修改PROFESSION表的FIELDNAME字段数据,替换为FIELD表主键对应的数值;要么调整实体类的关联逻辑(如果原本就想用字符串字段关联而非主键)。

2. 关联字段的配置错误

如果你的业务逻辑是通过Field的某个字符串字段(而非主键)关联Profession,那么当前的关联配置缺少关键参数:

  • 在Field实体中补充对应字符串字段的定义:
    @Entity(name = "Field")
    @Table(name = "FIELD")
    public class Field extends DescriptionBase implements OrderableInf {
    
        @Column(name = "FIELDNAME")
        private String fieldName; // 新增对应字符串字段
    
        @OneToMany(mappedBy = "field", fetch = FetchType.EAGER)
        private List<Profession> professions = new ArrayList<>();
    
        // getter、setter省略
    }
    
  • 修改Profession的关联配置,明确指定关联的目标字段:
    @Entity(name = "Profession")
    @Table(name = "PROFESSION")
    public class Profession extends DescriptionBase implements OrderableInf {
    
        @ManyToOne
        @JoinColumn(name = "FIELDNAME", referencedColumnName = "FIELDNAME")
        private Field field;
        // name:当前表的外键列名;referencedColumnName:关联实体的目标字段名
    
        // getter、setter省略
    }
    

3. 数据库字段类型验证

最后确认数据库层面的字段类型:

  • 如果用主键关联:PROFESSION.FIELDNAME字段类型需与FIELD表主键类型一致(比如都是BIGINT)。
  • 如果用字符串字段关联:PROFESSION.FIELDNAME和FIELD.FIELDNAME都需为字符串类型(比如VARCHAR)。

内容的提问来源于stack exchange,提问作者Ken Alton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 22:09:17