JPA本机查询返回Double或BigDecimal

时间:2016-01-14 09:42:28

标签: java postgresql jpa wildfly-9

我有以下简单的代码:

@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());

}

当我在真实环境中运行时,打印指令会打印java.math.BigDecimal。但是当我在单元测试环境中运行时,打印指令会打印java.lang.Double 在这两种情况下,我都使用WildFly 9服务器和Postgresql 9.4数据库。我还使用Arquillian进行单元测试。对我来说,唯一明显的区别是数据库中的记录数量 power表格中的mytable列为numeric(10,3)

我想避免使用丑陋的代码,例如:

if (singleResult instance of Double) {
    ...
} else if (singleResult instance of BigDecimal) {
    ...
}

无论我的运行环境如何,是否有办法始终拥有相同的实例?

2 个答案:

答案 0 :(得分:9)

BigDecimalDouble都延伸Number,您可以这样做:

Number singleResult = ((Number) entityManager.createNativeQuery(sqlString).getSingleResult());
double resultAsDouble = singleResult.doubleValue();
BigDecimal resultAsBigDecimal = new BigDecimal(singleResult.toString()); 

如果您想要基本类型,请使用resultAsDouble,但不关心保留精确的精度,否则请使用resultAsBigDecimal

答案 1 :(得分:-1)

你可以这样做

String sql = "SELECT SUM(power) FROM mytable";
Query q = em.createNativeQuery(sql);
BigDecimal result = (BigDecimal)q.getSingleResult();