复杂选择上的 HSQLDB org.springframework.dao.TransientDataAccessResourceException

Posted

技术标签:

【中文标题】复杂选择上的 HSQLDB org.springframework.dao.TransientDataAccessResourceException【英文标题】:HSQLDB org.springframework.dao.TransientDataAccessResourceException on complex select 【发布时间】:2018-11-06 22:06:53 【问题描述】:

我有一个在 Oracle 中运行良好的查询,但是当我尝试在 HSQLDB 中运行相同的查询时收到 org.springframework.dao.TransientDataAccessResourceException(使用 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】:

这是 HSQLDB 的限制。你可以试试CASE Order.status WHEN 'C' THEN Orderlines.qty ELSE 0 END 看看是否有效。

【讨论】:

以上是关于复杂选择上的 HSQLDB org.springframework.dao.TransientDataAccessResourceException的主要内容,如果未能解决你的问题,请参考以下文章

HSQLDB 在使用嵌套查询并且数据库处于只读模式时触发 OutOfMemoryError

主键定义上的 HSQLDB 错误

我的 HSQLDB 上的更改不一致

休眠和 HSQLDB - 适用于 PC - Linux 上的错误

Hsqldb - 如何删除 char 字段上的填充

使用 spring 数据源更改 HSQLDB 上的 blob 大小