gpt4 book ai didi

java - 使用 Spring Data JPA 将 Joda Money 的总和分成两列

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:17:19 25 4
gpt4 key购买 nike

我正在尝试使用 JODA money 类和 Jadira 类型来处理到 Hibernate 4 的映射。

它工作正常(除了我得到的货币字段太多)。

但我需要构建一个聚合查询来对一些总数求和。

这是类型声明。

@Columns(columns = { @Column(name = "total_currency", length=10), @Column(name = "total") })
@Type(type = "org.jadira.usertype.moneyandcurrency.joda.PersistentMoneyAmountAndCurrency")
private Money total;

我正在尝试定义一个查询,例如:

@Query(value="select sum(oi.total) from OrderItem oi where oi.order = ?1")
Double calculateSubtotal(Order order);

有没有一种方法可以使用 JPQL 聚合针对 Money 字段的查询?

谢谢。

最佳答案

有两种方法,但它们是有限的,我怀疑你真的会喜欢它们:(主要限制是在 Hibernate HQL 中你不能调用方法,除非它们是映射属性——故事结束。 Hibernate 不支持方法调用

另一方面,您可以根据需要多次映射一个列,只要您记住只有一个映射可以更新即可。牢记这一点 第一步是您需要让 Hibernate 意识到 joda Money。显然你不能只注释它。您可以通过两种方式执行此操作:

  1. 您可以使用 XML 将 Money 类实际注释为 @Embeddable 类。 XML hibernate 配置可用于配置封闭源代码的东西。从我在 Money joda 中看到的 - 时间配置。

  2. 第二种解决方案。可能是我会用的那个。就是把Money类包装在一个声明为@Embeddable的Wrapper中。这个嵌入式包装器可以为现有的数据库列定义多个映射。当您为 WRAPER 设置一个值时,该值将被推送到里面的 soda time Money。

完成此操作后,您可以通过包装器公开您想要的 Money 类的任何属性,并执行您想要的任何聚合。

@Embeddable
public class MoneyWrapper {


@Columns(columns = { @Column(name = "total_currency", length=10), @Column(name = "total") })
@Type(type = "org.jadira.usertype.moneyandcurrency.joda.PersistentMoneyAmountAndCurrency")
Money totalmoney;


@Column(name = "total",updateable=false,insterable=false);
BigDecimal total to agregate;

@Column(name = "total_currency",updateable=false,insterable=false);
BigDecimal totalCurrency;
}

作为此映射的结果,您可以执行如下查询:

@Query(value="select select sum(oi.total.totalCurrency) from OrderItem oi where oi.order = ?1")

关于java - 使用 Spring Data JPA 将 Joda Money 的总和分成两列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27444058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com