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
相关产品推荐
相关产品推荐

