You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 10:36:03