Found: decimal, expected: double precision
场景:
1 | 老项目,只能查询数据库不能对其修改。。。所以hibernate anto 设置成 validate |
异常:
1 | Hibernate: Found: decimal, expected: double precision |
处理办法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 1 、修改数据库字段,客户会杀死我的,抛弃。 2 . 使用正确的对应方式改java对象: 当然如果你想一个一个的改的话,这是最好,最稳妥的办法。 如果程序不继续抛出 Hibernate: Found: decimal, expected: double numric( 19 , 0 ) 的话。 3 . 读读异常名,方言发现decimal(当然我不知道什么意思),但是特么不影响理解,那就是类型不对了呗。 引用牛逼的英语: Unless you define column type as double precision in DDL file, Oracle will it convert to float column type. So you need to register double as float column type in dialect class . public class Oracle10gDialectExtended extends Oracle10gDialect { public Oracle11gDialect() { super (); registerColumnType(Types.DOUBLE, "float" ); } } 好吧,看在你可能不懂的份上,我翻译下,你要么写ddl文件定义到数据库列类别。或者你写java程序直接定义列。 大概意思是:java程序和数据库接口类型对应不上了。那你定义就好了,就是写个方言的子类,在子类构造方法中 定义你要解决的方案。 4 .把validate 改成 update (这是我最鄙视的) |
最终解决方案:
1 2 3 4 5 6 7 8 9 10 11 | public class FixSQLServerDialect extends SQLServerDialect{ public FixSQLServerDialect(){ super (); registerColumnType( Types.DOUBLE, "decimal" ); registerColumnType( Types.BIGINT, "decimal" ); registerColumnType( Types.TINYINT, "decimal" ); } } |
备注:当然这不是好的解决方案,不是第二套 不修改其他不可控的文件。会出现重复定义指向的问题,不符合推广的概念
1 2 3 4 5 | Hibernate: Found: decimal, expected: bit 和 Hibernate: Found: bit, expected: decimal 相互交替出现,就是你定义不是不定义也不是。。。这就需要你在这时候取舍,选的 2 套和 3 套结合的方式,修改java类属性 :就是 boolean 改成 byte 或者其他能正常表示的,详见 下面java对象类型对应。 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 提醒: super ()一定要加上,这是源码里面的构造函数,不要给自己制造未知麻烦。。 public SQLServerDialect() { registerColumnType( Types.VARBINARY, "image" ); registerColumnType( Types.VARBINARY, 8000 , "varbinary($l)" ); registerColumnType( Types.LONGVARBINARY, "image" ); registerColumnType( Types.LONGVARCHAR, "text" ); registerColumnType( Types.BOOLEAN, "bit" ); registerFunction( "second" , new SQLFunctionTemplate( StandardBasicTypes.INTEGER, "datepart(second, ?1)" ) ); registerFunction( "minute" , new SQLFunctionTemplate( StandardBasicTypes.INTEGER, "datepart(minute, ?1)" ) ); registerFunction( "hour" , new SQLFunctionTemplate( StandardBasicTypes.INTEGER, "datepart(hour, ?1)" ) ); registerFunction( "locate" , new StandardSQLFunction( "charindex" , StandardBasicTypes.INTEGER ) ); registerFunction( "extract" , new SQLFunctionTemplate( StandardBasicTypes.INTEGER, "datepart(?1, ?3)" ) ); registerFunction( "mod" , new SQLFunctionTemplate( StandardBasicTypes.INTEGER, "?1 % ?2" ) ); registerFunction( "bit_length" , new SQLFunctionTemplate( StandardBasicTypes.INTEGER, "datalength(?1) * 8" ) ); registerFunction( "trim" , new AnsiTrimEmulationFunction() ); registerKeyword( "top" ); } |
相关:参考外文博客解决方案
分类:
hibernate
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!