HSQLDB org.springframework.dao.TransientDataAccessResourceException при сложном выборе - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть запрос, который отлично работает в Oracle, но я получаю org.springframework.dao.TransientDataAccessResourceException при попытке выполнить тот же запрос в HSQLDB (используя режим совместимости с Oracle).

Вот вопрос в вопросе:

select 
    Orders.id,
    (select sum(decode(Orders.status, 'C', Orderlines.qty, 0)) 
     from Orderlines where orderId = Orders.id
    ) as "productQuantity"
from Orders
join Orderlines on Orders.id = Orderlines.orderId
where Orders.customerId = ?
group by Orders.id, Orders.status

Вот корень трассировки стека

Caused by: org.hsqldb.HsqlException: java.lang.NullPointerException
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.result.Result.newErrorResult(Unknown Source)
at org.hsqldb.result.Result.newErrorResult(Unknown Source)
at org.hsqldb.StatementDMQL.execute(Unknown Source)
at org.hsqldb.Session.executeCompiledStatement(Unknown Source)
at org.hsqldb.Session.execute(Unknown Source)
... 60 more
Caused by: java.lang.NullPointerException
at org.hsqldb.ExpressionColumn.getValue(Unknown Source)
at org.hsqldb.Expression.getValue(Unknown Source)
at org.hsqldb.ExpressionOp.getValue(Unknown Source)
at org.hsqldb.ExpressionAggregate.updateAggregatingValue(Unknown Source)
at org.hsqldb.QuerySpecification.buildResult(Unknown Source)
at org.hsqldb.QuerySpecification.getSingleResult(Unknown Source)
at org.hsqldb.QuerySpecification.getResult(Unknown Source)
at org.hsqldb.StatementQuery.getResult(Unknown Source)
... 63 more

Если я слегка упросту запрос, удалив предложение decode, HSQLDB сможет его обработать.

select 
    Orders.id,
    (select sum(Orders.status) 
     from Orderlines where orderId = Orders.id
    ) as "productQuantity"
from Orders
join Orderlines on Orders.id = Orderlines.orderId
where Orders.customerId = ?
group by Orders.id, Orders.status

Это известное ограничение HSQLDB?

Есть идеи, как пройти через это? Я пытаюсь использовать HSQLDB для модульных тестов, поэтому изменение запроса на самом деле не вариант, если решение не работает и для Oracle.

1 Ответ

0 голосов
/ 07 ноября 2018

Это ограничение HSQLDB. Вместо этого вы можете попробовать CASE Order.status WHEN 'C' THEN Orderlines.qty ELSE 0 END и посмотреть, работает ли он.

...