我正在尝试使用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字段的查询?
感谢。
答案 0 :(得分:4)
有两种方法,但它们是有限的,我怀疑你会非常喜欢它们:( 主要限制是,在Hibernate HQL中,除非它们是映射属性,否则无法调用方法 - 故事结束。 Hibernate不支持方法调用
另一方面,只要您记住只有一个映射可以更新,您可以根据需要多次映射一列。考虑到这一点第一步是你需要让Hibernate知道 joda Money 。显然你不能只是注释它。有两种方法可以做到这一点:
您可以使用XML实际将Money类注释为@Embeddable类。 XML hibernate配置可用于配置闭源的东西。从我在Money joda - time配置中看到的内容。
第二种解决方案。可能是我会使用的那个。是将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;
}
作为此映射的结果,您可以执行以下查询:
@Query(value ="从OrderItem oi中选择select sum(oi.total.totalCurrency),其中 oi.order =?1")