4

我有下面的简单代码:

@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 进行单元测试。对我来说,唯一明显的区别是数据库中的记录数。
表中的powermytablenumeric(10,3).

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

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

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

4

2 回答 2

12

BigDecimal和extend ,所以你可以这样做DoubleNumber

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

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

于 2016-01-14T13:55:23.027 回答
-1

你可以这样做

String sql = "SELECT SUM(power) FROM mytable";
Query q = em.createNativeQuery(sql);
BigDecimal result = (BigDecimal)q.getSingleResult();
于 2017-01-27T21:41:53.427 回答