spring-data-jpa 转换 @query 货币金额结果

wfveoks0  于 2022-11-10  发布在  Spring
关注(0)|答案(1)|浏览(194)

我刚刚将所有的java.math.BigDecimal用法都转换成了javax.money.MonetaryAmount(它们代表货币)。我现在使用MoneyUtils来“假定”货币为USD,以避免添加额外的数据库列,这些列中只包含“USD”。这可以在下面的两个代码片段中看到。
第一个
我有一个@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();

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

  • 我是不是漏掉了什么?
  • 有没有一种方法可以做到这一点,而不需要在这个存储库方法的调用者中手动进行转换?
cyej8jka

cyej8jka1#

可以使用构造函数表达式:
SELECT子句标识要作为查询结果返回的对象和值。除非另有说明,否则第11.4节“表达式”中讨论的表达式都是有效的选择表达式。有关根据SELECT子句中指定的值类型处理结果的信息,请参阅第11.10节“查询API”。
有一种特定的表达式类型只在select子句中有效。Hibernate将此称为“动态示例化”。JPQL支持其中的一些特性,并将其称为“构造函数表达式”
一般示例:

select new Person(user.name, address)
from User as user
left join user.address as address

在你问之前,不行,你不能调用方法,只能调用构造函数。另外,你需要考虑到你的查询可能返回null。你可以写一个 Package 类。

public final class MonetaryAmountWrapper {
  public MonetaryAmountWrapper(final BigDecimal value) {
    this.monetaryAmount = Money.of(value, MoneyUtils.DOLLAR);
  }

  private final MonetaryAmount monetaryAmount;
}

相关问题