Oracle SQL查询BigDecimal转int报QuerySyntaxException问题求助
问题原因
你使用的是HQL/JPQL查询(从new someDTO()的DTO构造投影语法可判断,不属于原生SQL),抛出QuerySyntaxException是因为HQL的CAST函数不识别int作为合法的目标转换类型:HQL类型解析使用自身注册的类型体系,不直接支持数据库侧的类型简写、Java原生类型小写简写,语法解析阶段匹配不到类型就会直接抛异常。
解决方案
优先使用HQL类型体系内置的类型名做转换,按兼容性从高到低选以下写法即可:
- 方案1:使用全限定Java类型名(全版本Hibernate/OpenJPA兼容)
将目标类型改为java.lang.Integer,修改后语句:SELECT new someDTO(l.name, CAST(NVL(table1.amount, table2.BigDecimalAmount) AS java.lang.Integer)) FROM..... - 方案2:使用HQL内置的基础类型关键字(大部分主流Hibernate版本支持)
将目标类型改为大写的INTEGER,修改后语句:SELECT new someDTO(l.name, CAST(NVL(table1.amount, table2.BigDecimalAmount) AS INTEGER)) FROM.....
注意事项
- 提前确认
someDTO的对应构造方法,第二个入参类型必须是Integer/int,如果构造器该位置参数仍为BigDecimal,转换成功后也会抛出构造方法不匹配异常。 NVL是Oracle等部分数据库的专属函数,HQL通用的空值合并函数为COALESCE,如果后续需要跨数据库兼容,可以将NVL替换为COALESCE,当前环境NVL可正常解析的话无需调整。- 不推荐通过
FUNCTION关键字直接调用数据库原生CAST函数绕过解析,这种写法会绑定特定数据库语法,丢失ORM的跨数据库兼容能力。
内容的提问来源于stack exchange,提问作者Commander300
相关产品推荐
相关产品推荐

