Java+PostgreSQL+Hibernate报错:INSERT表达式数量超过目标列
问题原因分析
- 错误根本不在Hibernate生成的INSERT语句里——日志已经证实Hibernate对
public.hearingdetails的插入语句列数和值数都是12个,完全匹配。问题出在绑定到该表的PL/pgSQL函数hearing_history()上。 - 当Hibernate向
hearingdetails插入数据时,大概率触发了关联的INSERT触发器,触发器调用了hearing_history()函数,而该函数第11行的INSERT语句存在目标列数量与VALUES子句中表达式数量不匹配的问题,具体是值的数量多于指定的列数。
解决方案
- 定位函数代码:登录PostgreSQL数据库,执行以下命令查看
hearing_history()的源码:
找到第11行的INSERT语句。SELECT prosrc FROM pg_proc WHERE proname = 'hearing_history'; - 修正INSERT语句:对比语句中
INSERT INTO指定的列数和VALUES里的值的数量,确保两者完全一致。比如:- 错误示例:
INSERT INTO hearing_log (id, content) VALUES (1, 'test', 'extra_val');(列数2,值数3) - 修正后:
INSERT INTO hearing_log (id, content, extra_col) VALUES (1, 'test', 'extra_val');或者删除多余的值
- 错误示例:
- 验证修复:重新执行Hibernate的事务提交操作,确认错误消失。也可以手动模拟触发器场景调用函数,测试执行是否正常。
内容的提问来源于stack exchange,提问作者Anish Narayan
相关产品推荐
相关产品推荐

