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

时间:2014-12-12 12:50:40

标签: java hibernate jpa spring-data joda-money

我正在尝试使用Jadira类型的JODA money类来处理到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字段的查询?

感谢。

1 个答案:

答案 0 :(得分:4)

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

另一方面,只要您记住只有一个映射可以更新,您可以根据需要多次映射一列。考虑到这一点第一步是你需要让Hibernate知道 joda Money 。显然你不能只是注释它。有两种方法可以做到这一点:

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

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

  3. 执行此操作后,您可以通过包装器公开所需的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 ="从OrderItem oi中选择select sum(oi.total.totalCurrency),其中   oi.order =?1")