当前位置: 首页 > 知识库问答 >
问题:

转换@Query MonetaryAmount结果

储峻
2023-03-14

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

@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();

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

@Query("query that can return null or a numeric")
@Convert(converter = MonetaryAmountConverter.class)
MonetaryAmount sumSomeData();

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

  • 我错过了什么吗?
  • 有没有办法做到这一点,而不需要在此存储库方法的调用方中手动执行转换?

共有1个答案

戚奇略
2023-03-14

您可以使用构造函数表达式:

SELECT 子句标识要作为查询结果返回的对象和值。除非另有说明,否则第 11.4 节 “表达式”中讨论的表达式都是有效的选择表达式。参阅第 11.10 节 “查询 API”,了解有关根据 SELECT 子句中指定的值类型处理结果的信息。

有一种特殊的表达式类型只在select子句中有效。Hibernate称之为“动态实例化”。JPQL支持其中一些特性,并称之为“构造函数表达式”

一般示例:

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

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

java prettyprint-override">public final class MonetaryAmountWrapper {
  public MonetaryAmountWrapper(final BigDecimal value) {
    this.monetaryAmount = Money.of(value, MoneyUtils.DOLLAR);
  }

  private final MonetaryAmount monetaryAmount;
}
 类似资料:
  • 我已经看到,当我们使用或时,JOOQ可以自动返回POJO 但是有可能将复杂查询的结果转换成多个POJO吗? 我测试了方法,它工作得很好。但我没有支持对象。

  • 5.5 结果的类型转换 类型转换(Formatter机制)是WebMagic 0.3.2增加的功能。因为抽取到的内容总是String,而我们想要的内容则可能是其他类型。Formatter可以将抽取到的内容,自动转换成一些基本类型,而无需手动使用代码进行转换。 例如: @ExtractBy("//ul[@class='pagehead-actions']/li[1]//a[@class='socia

  • 问题内容: 我从JavaScript进行$ getJSON调用得到以下结果。如何在JavaScript中将start属性转换为正确的日期? [{“ id”:1,“ start”:“ / Date(1238540400000)/”},{“ id”:2,“ start”:“ / Date(1238626800000)/”}] 谢谢! 问题答案: 您需要从字符串中提取数字,并将其传递给Date : 这些

  • 本文向大家介绍sqlalchemy 将结果转换成字典,包括了sqlalchemy 将结果转换成字典的使用技巧和注意事项,需要的朋友参考一下 示例 在SQLAlchemy核心中,结果为RowProxy。如果您需要显式词典,可以致电dict(row)。 首先为示例进行设置: 然后从结果行创建字典:            

  • 问题内容: 我正在尝试使用该包将Go结构转换为JSON,但我得到的只是。我敢肯定这是完全显而易见的,但我看不到。 然后,当我尝试运行它时,我得到以下信息: 问题答案: 您需要导出的字段,以便在包装可以看到它。将字段重命名为。 输出:

  • 问题内容: 我试图在Go中创建一个通用方法,该方法将填充来自的使用数据。例如,方法签名和用法可能类似于: 我知道可以使用JSON作为中介来完成;还有另一种更有效的方法吗? 问题答案: 最简单的方法是使用https://github.com/mitchellh/mapstructure 如果您想自己做,则可以执行以下操作: http://play.golang.org/p/tN8mxT_V9h