首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >转换@查询MonetaryAmount结果

转换@查询MonetaryAmount结果
EN

Stack Overflow用户
提问于 2022-08-10 15:19:59
回答 1查看 49关注 0票数 1

我刚刚将我所有的java.math.BigDecimal用法转换为javax.money.MonetaryAmount (在那里,它们代表货币)。目前,我在MoneyUtils的帮助下“假设”货币为美元,以避免添加只包含“美元”的额外数据库列。在接下来的两个片段中可以看到这一点。

代码语言:javascript
复制
@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);
        }
    }
}
代码语言:javascript
复制
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

代码语言:javascript
复制
@Query("query that can return null or a numeric")
MonetaryAmount sumSomeData();

问题是它没有通过我的MonetaryAmountConverter。我尝试将一个@Convert直接添加到方法中,但是它没有起作用。

代码语言:javascript
复制
@Query("query that can return null or a numeric")
@Convert(converter = MonetaryAmountConverter.class)
MonetaryAmount sumSomeData();

因此,带有AttributeConverter@Converter(autoApply = true)似乎适用于JPA实体字段,但不适用于方法返回类型,即使将@Convert添加到方法签名中也是如此。

  • 我遗漏了什么吗?
  • 是否有一种无需在此存储库方法的调用方中手动执行转换的方法?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-10 15:43:00

您可以使用构造表达式

SELECT子句标识作为查询结果返回的对象和值。第11.4节,“词句”中讨论的表达式都是有效的select表达式,除非另有说明。有关根据SELECT子句中指定的值类型处理结果的信息,请参见第11.10节,“查询API”部分。 只有在select子句中才有效的特定表达式类型。Hibernate称之为“动态实例化”。JPQL支持其中的一些特性,并称其为“构造函数表达式”。

一般例子:

代码语言:javascript
复制
select new Person(user.name, address)
from User as user
left join user.address as address

在问之前,不可以调用方法,只能调用构造函数。此外,您还需要考虑查询可能返回null这一事实。你可以写一个包装类。

代码语言:javascript
复制
public final class MonetaryAmountWrapper {
  public MonetaryAmountWrapper(final BigDecimal value) {
    this.monetaryAmount = Money.of(value, MoneyUtils.DOLLAR);
  }

  private final MonetaryAmount monetaryAmount;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73308841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档