【发布时间】:2019-12-10 04:54:30
【问题描述】:
我有两个 select 语句,每个语句计算一列的总和。需要获取两个 select 语句的总和。它在普通 sql 中工作,但不适用于休眠的 @Query 注释。
尝试使用正常的 sql 查询运行上述问题,但同样不适用于休眠 @Query 注释
select sum((SELECT SUM(TRAN_AMT+FEE_AMT)
FROM pymt
WHERE TRANTM between '2019-06-01 00:00:00' and '2019-06-23 23:59:59'
AND PAYEE = unhex('xxxxxx')
AND TRANTYPECDE = '003'
AND RESP_CDE = 'Success')-(
SELECT SUM(TRAN_AMT-FEE_AMT)
FROM pymt
WHERE TRAN_CAPTR_DT_TM between '2019-06-01 00:00:00' and '2019-06-23 23:59:59'
AND PAYEE = unhex('xxxxxx')
AND TRANTYPECDE != '003'
AND RESP_CDE = 'Success')) as sumValue;
上面的工作正常,但下面的查询在休眠状态下不工作
@Query(value = "SELECT SUM((SELECT SUM(p.feeAmt + p.tranAmt) "
+"FROM PymtEntity p "
+ "WHERE p.tranCaptrTm >= :from AND p.tranCaptrTm <= :to "
+"AND p.tranTypeCde = '003' "
+ "AND p.payeeId = :md "
+ "AND p.respCde = :re )"
+"-"
+"(SELECT SUM( p.tranAmt - p.feeAmt) "
+"FROM PymtEntity p "
+ "WHERE p.tranCaptrTm >= :from AND p.tranCaptrTm <= :to "
+"AND p.tranTypeCde != '003' "
+ "AND p.payeeId = :md "
+ "AND p.respCde = :re )) as sumtotal")
上面返回QuerySyntaxException:子树的意外结束
预计要打印的总和 但得到 QuerySyntaxException: 休眠中子树的意外结束
堆栈跟踪
... 29 common frames omitted
Caused by: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected end of subtree [SELECT SUM((SELECT SUM(p.feeAmt + p.tranAmt) FROM com.hsbc.digital.peak.payments.reporting.data.entities.PymtEntity p WHERE p.tranCaptrTm >= :from AND p.tranCaptrTm <= :to AND p.tranTypeCde = '003' AND p.payeeId = :merchantId AND p.respCde = :respCode )-(SELECT SUM( p.tranAmt - p.feeAmt) FROM com.hsbc.digital.peak.payments.reporting.data.entities.PymtEntity p WHERE p.tranCaptrTm >= :from AND p.tranCaptrTm <= :to AND p.tranTypeCde != '003' AND p.payeeId = :merchantId AND p.respCde = :respCode )) as sumtotal]
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:138)
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181)
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:188)
at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:713)
at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:23)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:350)
at com.sun.proxy.$Proxy135.createQuery(Unknown Source)
at org.springframework.data.jpa.repository.query.SimpleJpaQuery.validateQuery(SimpleJpaQuery.java:87)
... 58 common frames omitted
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected end of subtree [SELECT SUM((SELECT SUM(p.feeAmt + p.tranAmt) FROM com.hsbc.digital.peak.payments.reporting.data.entities.PymtEntity p WHERE p.tranCaptrTm >= :from AND p.tranCaptrTm <= :to AND p.tranTypeCde = '003' AND p.payeeId = :merchantId AND p.respCde = :respCode )-(SELECT SUM( p.tranAmt - p.feeAmt) FROM com.hsbc.digital.peak.payments.reporting.data.entities.PymtEntity p WHERE p.tranCaptrTm >= :from AND p.tranCaptrTm <= :to AND p.tranTypeCde != '003' AND p.payeeId = :merchantId AND p.respCde = :respCode )) as sumtotal]
at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:74)
at org.hibernate.hql.internal.ast.ErrorTracker.throwQueryException(ErrorTracker.java:93)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:277)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:191)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:143)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:119)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:153)
at org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:595)
at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:704)
... 66 common frames omitted
【问题讨论】:
-
你为什么不在没有所有子查询的情况下对总和进行一次查询?我坚信这是可能的
-
因为我有不同的条件,我需要进行两个选择查询。事情是一个选择查询@Query注释正在工作
-
对于您发布的查询,它是完全相同的查询的 2 倍。看起来您在第二个
AND p.payeeId = :md中缺少!。同时发布整个堆栈跟踪 -
编辑相同