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字段的查询?
谢谢.
有两种方法,但是它们是有限的,我怀疑您是否会真的喜欢它们:( 主要限制是,在Hibernate HQL中,除非它们被映射为属性,否则不能调用方法-故事的结尾。Hibernate不支持Method Invocation
另一方面,只要您记住只有一个映射是可更新的,则可以根据需要多次映射一个列。牢记这一点第一步是您需要让Hibernate意识到joda Money。显然,您不能仅对其进行注释。您可以通过两种方式执行此操作:
您可以使用XML实际上将Money类注释为@Embeddable类。XML休眠配置可用于配置封闭源代码。根据我在Money joda中看到的内容-时间配置。
第二种解决方案。可能是我会用的那个。是将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”)
| 归档时间: |
|
| 查看次数: |
822 次 |
| 最近记录: |