1

我使用的是 Hibernate,但做了一个简单的 SQLQuery,所以我认为这归结为一个基本的 JDBC 问题。我的生产应用程序在 MySQL 上运行,但我的测试用例使用内存中的 HSQLDB。我发现 SELECT COUNT 操作从 MySQL 返回 BigInteger,但从 HSQLDB 返回 Long。

MySQL 5.5.22 HSQLDB 2.2.5

我想出的代码是:

SQLQuery tq = session.createSQLQuery(
    "SELECT COUNT(*) AS count FROM calendar_month WHERE date = :date");
tq.setDate("date", eachDate);
Object countobj = tq.list().get(0);
int count = (countobj instanceof BigInteger) ?
    ((BigInteger)countobj).intValue() : ((Long)countobj).intValue();

返回类型的这个问题否定了其他 SO 问题的答案,例如在 hibernate 中使用 createSQLQuery 获取 count(*)?建议用于setResultTransformer将返回值映射到 bean。bean 的类型必须是 BigInteger 或 Long,如果类型不正确则失败。

由于担心数据库互操作性,我不愿意在我的 SQL 的 'COUNT(*) AS count' 部分使用强制转换运算符。我意识到我已经在使用createSQLQuery,所以我已经超出了 Hibernates 尝试数据库中立性的范围,但是之前在数据库约束方面遇到了 MySQL 和 HSQLDB 之间的差异

有什么建议吗?

4

3 回答 3

1

您可以向下转换为 Number,然后调用 intValue() 方法。例如

SQLQuery tq = session.createSQLQuery("SELECT COUNT(*) AS count FROM calendar_month WHERE date = :date");
tq.setDate("date", eachDate);
Object countobj = tq.list().get(0);
int count = ((Number) countobj).intValue();
于 2014-12-09T18:56:35.673 回答
1

我不知道这个问题的明确解决方案,但我建议您使用H2 数据库进行测试。

H2 数据库有一个功能,您可以使用兼容模式连接到多个不同的数据库。

例如,要使用 MySQL 模式,您可以使用此jdbc:h2:~/test;MODE=MySQLURL 连接到数据库。

于 2012-04-20T06:26:15.850 回答
0

两个想法:

  1. 您可以将结果值作为字符串获取,然后将其解析为 Long 或 BigInteger

  2. 不要使用COUNT(*) AS count FROM ...,最好使用类似的东西,COUNT(*) AS cnt ...但在您的示例代码中,您不使用结果列的名称而是索引,因此您可以简单地使用COUNT(*) FROM ...

于 2012-04-20T06:27:31.990 回答