如何最好地从 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?大整数?的主要内容,如果未能解决你的问题,请参考以下文章