JPA native query returns Double or BigDecimal
java, jpa, postgresql, wildfly-9
Solution
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.
Problem
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 ?