我刚刚将我所有的java.math.BigDecimal用法转换为javax.money.MonetaryAmount (在那里,它们代表货币)。目前,我在MoneyUtils的帮助下“假设”货币为美元,以避免添加只包含“美元”的额外数据库列。在接下来的两个片段中可以看到这一点。
@Converter(autoApply = true)
public class MonetaryAmountConverter
implements AttributeConverter<MonetaryAmount, BigDecimal> {
@Override
public BigDecimal convertToDatabaseColumn(final MonetaryAmount monetaryAmount) {
return DefaultUtils.defaultOrNull(
monetaryAmount,
ma -> ma.getNumber().numberValue(BigDecimal.class));
}
@Override
public MonetaryAmount convertToEntityAttribute(final BigDecimal monetaryAmountValue) {
if (monetaryAmountValue == null) {
return null;
} else {
return MoneyUtils.of(monetaryAmountValue);
}
}
}public final class MoneyUtils {
public static final CurrencyUnit DOLLAR = Monetary.getCurrency(Locale.US);
public static MonetaryAmount of(@NonNull final BigDecimal value) {
return Money.of(value, MoneyUtils.DOLLAR);
}
}我有一个@Repository方法,它应该给我一个求和,如果没有行匹配,它可以是null:
@Query("query that can return null or a numeric")
MonetaryAmount sumSomeData();问题是它没有通过我的MonetaryAmountConverter。我尝试将一个@Convert直接添加到方法中,但是它没有起作用。
@Query("query that can return null or a numeric")
@Convert(converter = MonetaryAmountConverter.class)
MonetaryAmount sumSomeData();因此,带有AttributeConverter的@Converter(autoApply = true)似乎适用于JPA实体字段,但不适用于方法返回类型,即使将@Convert添加到方法签名中也是如此。
发布于 2022-08-10 15:43:00
您可以使用构造表达式
SELECT子句标识作为查询结果返回的对象和值。第11.4节,“词句”中讨论的表达式都是有效的select表达式,除非另有说明。有关根据SELECT子句中指定的值类型处理结果的信息,请参见第11.10节,“查询API”部分。 只有在select子句中才有效的特定表达式类型。Hibernate称之为“动态实例化”。JPQL支持其中的一些特性,并称其为“构造函数表达式”。
一般例子:
select new Person(user.name, address)
from User as user
left join user.address as address在问之前,不可以调用方法,只能调用构造函数。此外,您还需要考虑查询可能返回null这一事实。你可以写一个包装类。
public final class MonetaryAmountWrapper {
public MonetaryAmountWrapper(final BigDecimal value) {
this.monetaryAmount = Money.of(value, MoneyUtils.DOLLAR);
}
private final MonetaryAmount monetaryAmount;
}https://stackoverflow.com/questions/73308841
复制相似问题