Java JPA本机查询返回Double或BigDecimal

Java JPA本机查询返回Double或BigDecimal,java,postgresql,jpa,wildfly-9,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).

我有下面的简单代码:

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

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

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

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

既有
BigDecimal
又有
Double
extend
Number
,因此您可以执行以下操作:

Number singleResult = ((Number) entityManager.createNativeQuery(sqlString).getSingleResult());
double resultAsDouble = singleResult.doubleValue();
BigDecimal resultAsBigDecimal = new BigDecimal(singleResult.toString()); 
使用
resultAsBigDecimal
如果您想要原语类型,但不关心保留精确的精度,请使用
resultAsBigDecimal
否则。

您可以这样做

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

您可以使用双精度来代替数字,以了解更多详细信息请参见:我认为这不是一个好的解决方案,因为它指出:
如果您需要精确的存储和计算(例如货币金额),请使用数字类型。
为什么要对JPQL支持的东西使用本机查询(假设“mytable”有一个实体)…@NeilStockton,因为实际上我的要求比我的例子中的要求复杂得多。例如,有子查询。也许是最好的解决方法。我会尽快尝试。我认为这是目前为止最安全的解决办法。