2

我在内存中使用 hsqldb 来执行 JUnit 测试,以测试数据访问对象。

在 DAO 中,我使用 JPA 实体管理器来启动以下原生 SQL 查询:

SELECT COUNT(*) FROM AAA

代码如下所示:

final Query query = entityManager.createNativeQuery("SELECT COUNT(*) FROM AAA");
return (Integer) query.getSingleResult() == 0;

return 语句让我检查我的计数是否等于 0。它在生产环境中工作正常(使用 DB2)。

但是在我们的测试环境中,在内存中使用 hsqldb 时,它会失败,因为查询没有返回 Integer 或 int,而是返回 a BigDecimal(强制转换失败)。

使用 HsqlDB 2.3.0。之前使用 1.8 版本的 hsqldb 运行良好。

你知道为什么会出现这个问题吗?我怎样才能使count(*)返回一个整数?

我希望尽可能地让生产代码保持不变。因为我已经知道我可以使用 sql cast 来解决这个问题,但在我看来这并不理想:

SELECT cast(COUNT(*) as int) FROM AAA
4

1 回答 1

1

您可以将 Java 代码更改为与平台无关。将返回值转换为 Number 并使用 getLong() 而不是比较 Integer。

HSQLDB 实际上返回 Long,而不是 BigDecimal

于 2013-10-18T17:34:32.060 回答