I got burned by Hibernate the other day. This code throws a ClassCastException; can you see what the trouble might be?
return (Integer) session.createSQLQuery(
"select count(*) " +
"from trades " +
"where date >= :from and date < :to")
.setParameter("from", converter.toString(from))
.setParameter("to", converter.toString(to))
.uniqueResult();
Under the covers Hibernate infers the result of the query as type BigInteger, thus the ClassCastException. It’s fixed by declaring the type of the returned value using addScalar():
return (Integer) session.createSQLQuery(
"select count(*) c " +
"from trades " +
"where date >= :from and date < :to")
.addScalar("c", new IntegerType())
.setParameter("from", converter.toString(from))
.setParameter("to", converter.toString(to))
.uniqueResult();
I suppose a Hibernate guru would tell me to use HQL or some other sub-API (not sure if it would help in this case), but for such a simple query I would like to have the library be error-proof.
Plug: My friend Brian’s jDBI (an alternative to Hibernate) avoids problems like the above by providing type-safe return values.