如何最好地从 Java/JDBC 中的 SQL 查询中检索 SELECT COUNT(*) 的结果 - Long?大整数?

Posted

技术标签:

【中文标题】如何最好地从 Java/JDBC 中的 SQL 查询中检索 SELECT COUNT(*) 的结果 - Long?大整数?【英文标题】:How best to retrieve result of SELECT COUNT(*) from SQL query in Java/JDBC - Long? BigInteger? 【发布时间】:2012-04-20 05:45:21 【问题描述】:

我正在使用 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 问题的答案,例如 getting count(*) using createSQLQuery in hibernate?,其中建议使用 setResultTransformer 将返回值映射到 bean。 bean 的类型必须为 BigInteger 或 Long,如果类型不正确,则失败。

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

有什么建议吗?

【问题讨论】:

在纯 JDBC 中,您可以简单地使用 ResultSet.getLong(1)。驱动程序负责进行正确的数据类型映射。我不知道 Hibernate 中的等价物是什么。 谢谢马.. 是的,纯 JDBC 可能会使这更容易,但通过 Hibernate,只有 get(int) 返回 Object。就类型安全性而言,它似乎是一个非常笨拙的接口,并且让底层 JDBC 驱动程序的这些变幻莫测的接口保持开放,如果那正是选择返回给我的类型的话。 【参考方案1】:

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

H2 数据库具有a feature,您可以使用兼容模式将其连接到多个不同的数据库。

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

【讨论】:

感谢这个好建议。在找到时间考虑迁移之前,我一直坚持使用 HSQLDB。鉴于我目前的工具集,我确信有一个类似的解决方案,而不是必须切换到 H2。【参考方案2】:

您可以向下转换为 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();

【讨论】:

【参考方案3】:

两个想法:

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

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

【讨论】:

我不能接受这个作为解决方案。要将结果值作为字符串获取,我假设您的意思是在 SQL 中将其转换为 VARCHAR?对于这个问题,这似乎是绝对可怕和令人讨厌的解决方法。必须有一种方法来保留 COUNT 聚合中隐含的纯数字数据类型。您的第二点是有效的,但与问题无关。

以上是关于如何最好地从 Java/JDBC 中的 SQL 查询中检索 SELECT COUNT(*) 的结果 - Long?大整数?的主要内容,如果未能解决你的问题,请参考以下文章

JAVA JDBC 简单的增删改查

用java jdbc sqlserver写登录注册,增删改查代码

我应该如何最好地从 VB.net 查询我的数据集?

solr 使用java jdbc查询

详细解析java JDBC实现增删改查

java jdbc 删除数据库表中一列后不能用SQL语句在更新和查询表中其他数据了