6

我正在尝试使用带有 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;

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

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

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

谢谢。

4

1 回答 1

4

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

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

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

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

完成此操作后,您可以通过包装器公开您想要的 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")

于 2016-07-21T14:32:54.373 回答