2014-11-21 65 views
0

我使用Hibernate的方法uniqueResult()来获取记录的计数表中的编写自定义HSQLDialect改变Hibernate的返回类型uniqueResult()

"SELECT COUNT(*) AS C FROM TABLE"; 

在测试中,我们使用HSQLDB的内存或localhost数据库和uniqueResult()返回count(*)的java.math.BigInteger。但是在真实环境中,我们使用DB2,其中uniqueResult()返回java.lang.Integer。所以,当我跑我的测试中,我得到一个ClassCastException java.math.BigInteger cannot be cast to java.lang.Integer以下代码:

SQLQuery q = getSession(false).createSQLQuery(query); 
Integer count = (Integer) q.uniqueResult(); 

有一个修复,我发现通过添加addScalar()方法来指定返回类型:

SQLQuery q = getSession(false).createSQLQuery(query).addScalar("C", Hibernate.INTEGER); 

但有没有一种方法可以使全局的返回类型更改的默认行为?也许通过编写一个自定义的HSQLDialect来指定所有计数值作为整数返回?

回答

0

尝试使用select count(somecolumn)而不是select count(*)。您可能会发现返回的数据类型对于两个数据库都是相同的类型。我认为返回的类型与计数表达式中使用的列的类型有关。

+0

嗯,它似乎仍然返回一个BigInteger,我得到了同样的错误。另外,我宁愿将*保留在那里,因为我们的列名可以改变。即使当我计算(1)它仍然作为BigInteger回来 – Sivan 2014-11-21 14:51:01

+1

使用可以尝试转换为java.lang.Number,然后使用intValue或longValue方法。 – 2014-11-21 15:52:24

+0

好,所以这个工作,谢谢。但问题是,它与我在添加“addScalar()”时发现的修复相似,因为它要求您严格修改代码以用于测试目的。我读了“编写测试代码”的不好做法。 所以我实际上正在寻找一种方法来调整测试代码,以便它可以处理生产代码而不是反之亦然。也许调整方言可以做到这一点,但对我来说这是陌生的领域。 – Sivan 2014-11-26 16:44:30