使用Spring Data JPA将Joda Money的总和拆分为2列

Ric*_*d G 6 java hibernate jpa spring-data joda-money

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

它工作正常(除了我有太多的货币字段).

但我需要构建一个聚合查询来总结一些总数.

这是类型声明.

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

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

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

有没有办法使用JPQL聚合Money字段的查询?

谢谢.

Ale*_*rov 5

有两种方法,但是它们是有限的,我怀疑您是否会真的喜欢它们:( 主要限制是,在Hibernate HQL中,除非它们被映射为属性,否则不能调用方法-故事的结尾。Hibernate不支持Method Invocation

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

  1. 您可以使用XML实际上将Money类注释为@Embeddable类。XML休眠配置可用于配置封闭源代码。根据我在Money joda中看到的内容-时间配置。

  2. 第二种解决方案。可能是我会用的那个。是将Money类包装在声明为@Embeddable的Wrapper中。您可以使用此嵌入式包装器为现有数据库列定义多个映射。当您为WRAPER设置一个值时,该值将被推入内部的苏打时间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;  
}
Run Code Online (Sandbox Code Playgroud)

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

@Query(value =“ select从OrderItem oi中选择sum(oi.total.totalCurrency),其中oi.order =?1”)