JPA native query returns Double or BigDecimal
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.
cheb1k4
Updated on July 10, 2022Comments
-
cheb1k4 almost 2 years
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 printsjava.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.
Thepower
column inmytable
table is anumeric(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 ?
-
cheb1k4 over 8 yearsMaybe the best workaround. I will try it as soon as possible.
-
Max over 5 yearsThis by far in my opinion is the safest solution.