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