I have the simple code below:
@PersistenceContext(name = "mycontext")
private EntityManager entityManager;
public void getAggregatePower() {
String sqlString = "SELECT SUM(power) FROM mytable";
Object singleResult = entityManager.createNativeQuery(sqlString).getSingleResult();
System.out.println(singleResult.getClass().getName());
}
When I run this in a real environment, the print instructions prints java.math.BigDecimal. But when I run this in my unit tests environment, the print instructions prints java.lang.Double.
In both cases I use a WildFly 9 server and a Postgresql 9.4 database. I also use Arquillian for unit tests. For me, the only noticeable difference is the number of records in database.
The power column in mytable table is a numeric(10,3).
I would like to avoid ugly code such as:
if (singleResult instance of Double) {
...
} else if (singleResult instance of BigDecimal) {
...
}
Is there a way to always have the same instance no matter my running environment ?
Both BigDecimal and Double extend Number, so you can do:
Number singleResult = ((Number) entityManager.createNativeQuery(sqlString).getSingleResult());
double resultAsDouble = singleResult.doubleValue();
BigDecimal resultAsBigDecimal = new BigDecimal(singleResult.toString());
Use resultAsDouble if you want the primitive type, but don't care about preserving the exact precision, use resultAsBigDecimal otherwise.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With