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

自定义MonetaryAmount类型引发Hibernate ConversionException问题咨询

自定义MonetaryAmount类型在JPA查询中与数字字面量运算时的Hibernate异常问题

环境

  • Spring Boot & Spring JPA 3.2.4
  • Hibernate 6.4.4
  • PostgreSQL

自定义类型与JPA配置

我自定义了MonetaryAmount类,内部封装了javax.money.MonetaryAmount和BigDecimal:

public class MonetaryAmount extends Number implements Comparable<MonetaryAmount> {
   ...
}

将该类作为JPA实体字段类型使用,并搭配实现AttributeConverter<MonetaryAmount, BigDecimal>的MonetaryAmountConverter转换器:

@Convert(converter = MonetaryAmountConverter.class)
@Column(name = "total_amount")
private MonetaryAmount totalAmount = ZERO;

@Convert(converter = MonetaryAmountConverter.class)
@Column(name = "amount_raised")
private MonetaryAmount amountRaised = ZERO;

PostgreSQL数据库中对应列的类型为numeric(20,2)。

问题场景与异常

编写Spring JPA查询时,若左侧两个自定义类型字段使用+、-、*或/数学运算符进行运算,右侧使用单个数字字面量,例如:

@Query(value = "SELECT l FROM Loan l where l.amountRaised + l.totalAmount >= 2 ")

会触发Hibernate异常:

Caused by: org.hibernate.query.sqm.sql.ConversionException: Could not determine ValueMapping for SqmExpression: org.hibernate.query.sqm.tree.expression.SqmBinaryArithmetic@55bc8579
    at app//org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.determineValueMapping(BaseSqmToSqlAstConverter.java:5872)
    at app//org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.lambda$visitComparisonPredicate$111(BaseSqmToSqlAstConverter.java:7524)
at app//org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitHqlNumericLiteral(BaseSqmToSqlAstConverter.java:5583)
...

尝试使用2.0或2BD替代2,问题依然存在。但如果右侧改为两个数字字面量的运算(例如2 * 1),查询就能正常运行:

@Query(value = "SELECT l FROM Loan l where l.amountRaised + l.totalAmount >= 2 * 1")

疑问

这是Hibernate的缺陷(已提交缺陷工单HHH-17899),还是我的自定义类需要调整?

内容的提问来源于stack exchange,提问作者Sunil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 22:08:27