JPA/CriteriaBuilder查询Double值时忽略小数部分返回空列表问题
问题根因与解决方案
问题根因
核心原因是JPA Criteria API的类型推断错误:
criteriaBuilder.prod()方法传入Double类型的value和Integer类型的quantity做运算时,Hibernate等JPA实现会错误将运算结果、比较参数的类型推断为整数,导致传入的3900.99小数部分被截断,最终生成的SQL中比较值变成了整数3900,自然匹配不到3900.63的记录。
解决方案
1. 显式指定运算结果为浮点类型
修改SpecificationHelper工具类中的两个方法,强制运算结果以Double类型处理,避免类型推断错误:
public static Specification<Foo> getFooByMinValue(Double minValue) { return (root, query, criteriaBuilder) -> { Expression<Double> totalValue = criteriaBuilder.prod(root.get("value"), root.get("quantity")).as(Double.class); return criteriaBuilder.ge(totalValue, minValue); }; } public static Specification<Foo> getFooByMaxValue(Double maxValue) { return (root, query, criteriaBuilder) -> { Expression<Double> totalValue = criteriaBuilder.prod(root.get("value"), root.get("quantity")).as(Double.class); return criteriaBuilder.le(totalValue, maxValue); }; }
修改后重新启动项目,生成的SQL就会带上完整的小数参数,正常匹配符合条件的记录。
2. 可选优化(精度要求高的场景)
如果业务对数值精度要求严格,建议将实体类中value字段的Double类型替换为BigDecimal,同时在@Column注解中指定精度,避免浮点运算精度丢失:
@Column(name = "value", precision = 12, scale = 4) private BigDecimal value;
对应的运算逻辑也同步修改为BigDecimal类型的比较即可。
内容的提问来源于stack exchange,提问作者Hiago Rios
相关产品推荐
相关产品推荐

