JPA native query returns Double or BigDecimal

11,858

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.

Share:
11,858
cheb1k4
Author by

cheb1k4

Updated on July 10, 2022

Comments

  • cheb1k4
    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 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 ?

  • cheb1k4
    cheb1k4 over 8 years
    Maybe the best workaround. I will try it as soon as possible.
  • Max
    Max over 5 years
    This by far in my opinion is the safest solution.