自定义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
相关产品推荐
相关产品推荐

