我有下面的简单代码:
@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) {
...
}
无论我的运行环境如何,都可以始终拥有相同的实例?
最佳答案
BigDecimal
和Double
都扩展了Number
,因此您可以执行以下操作:
Number singleResult = ((Number) entityManager.createNativeQuery(sqlString).getSingleResult());
double resultAsDouble = singleResult.doubleValue();
BigDecimal resultAsBigDecimal = new BigDecimal(singleResult.toString());
如果需要原始类型,请使用
resultAsDouble
,但不关心保留确切的精度,否则请使用resultAsBigDecimal
。