我使用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来指定所有计数值作为整数返回?
嗯,它似乎仍然返回一个BigInteger,我得到了同样的错误。另外,我宁愿将*保留在那里,因为我们的列名可以改变。即使当我计算(1)它仍然作为BigInteger回来 – Sivan 2014-11-21 14:51:01
使用可以尝试转换为java.lang.Number,然后使用intValue或longValue方法。 – 2014-11-21 15:52:24
好,所以这个工作,谢谢。但问题是,它与我在添加“addScalar()”时发现的修复相似,因为它要求您严格修改代码以用于测试目的。我读了“编写测试代码”的不好做法。 所以我实际上正在寻找一种方法来调整测试代码,以便它可以处理生产代码而不是反之亦然。也许调整方言可以做到这一点,但对我来说这是陌生的领域。 – Sivan 2014-11-26 16:44:30