我正在尝试使用QueryDSL进行Coalesce而没有任何运气.
这是我想要做的:我有一些Order有OrderItem对象的对象.每个OrderItem都有一个价格(BigDecimal).对于每一个Order,我想要一个元组中返回的ID Order以及它的OrderItem价格总和.我的模型和我的查询实际上比这更复杂,因此,我必须在子查询中进行求和.
这是我写的:
NumberSubQuery<BigDecimal> sumQuery = new HibernateSubQuery()
.from(qOrderItem)
.where(qOrderItem.order.eq(qOrder))
.unique(qOrderItem.price.sum());
HibernateQuery query = new HibernateQuery(session).from(qOrder)
.list(new QOrderTuple(qOrder.id, sumQuery))
Run Code Online (Sandbox Code Playgroud)
OrderTuple 是一个只包含两个字段的元组:id(long)和priceSum(BigDecimal).
我写的查询工作正常.现在,我想确保如果Order没有OrderItem,则sumQuery返回0(而不是null,现在如此).我因此修改了我的子查询如下:
NumberSubQuery<BigDecimal> sumQuery = new HibernateSubQuery()
.from(qOrderItem)
.where(qOrderItem.order.eq(qOrder))
.unique(qOrderItem.price.sum().coalesce(BigDecimal.ZERO));
Run Code Online (Sandbox Code Playgroud)
问题是此代码无法编译,因为unique()现在返回的类型SimpleSubQuery<BigDecimal>.但是,构造函数QOrderTuple需要a NumberExpression<? extends BigDecimal>而不是a SimpleSubQuery<BigDecimal>.
我也尝试将添加asNumber()到coalesce(),但我得到了NumberExpression<?>,这是不被接受的构造函数既不.最后,我尝试使用显式Java强制转换来编译代码,但它在运行时失败:
java.lang.IllegalArgumentException: argument type mismatch
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at com.mysema.query.types.ConstructorExpression.newInstance(ConstructorExpression.java:131)
at com.mysema.query.jpa.FactoryExpressionTransformer.transformTuple(FactoryExpressionTransformer.java:50)
at org.hibernate.hql.HolderInstantiator.instantiate(HolderInstantiator.java:96)
at org.hibernate.impl.ScrollableResultsImpl.prepareCurrentRow(ScrollableResultsImpl.java:268)
at org.hibernate.impl.ScrollableResultsImpl.next(ScrollableResultsImpl.java:123)
Run Code Online (Sandbox Code Playgroud)
有没有我在合并语法上做错了?
提前致谢
| 归档时间: |
|
| 查看次数: |
1827 次 |
| 最近记录: |