JPA原生查询返回Double或BigDecimal

5
我有以下简单的代码:

我有以下简单的代码:

@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列是numeric(10,3)类型。
我想避免丑陋的代码,例如:
if (singleResult instance of Double) {
    ...
} else if (singleResult instance of BigDecimal) {
    ...
}

无论我在什么运行环境下,有没有一种方法总是能使用同一个实例?

您可以使用双精度代替数字,以获得更多详细信息,请参见:http://www.postgresql.org/docs/9.4/static/datatype-numeric.html#DATATYPE-FLOAT - anand mishra
我认为这不是一个好的解决方案,因为它指出了这一点: “如果您需要精确的存储和计算(例如货币金额),请改用数字类型。” - cheb1k4
为什么要在JPQL支持的情况下使用本地查询(假设“mytable”具有实体)... - Neil Stockton
@NeilStockton 因为实际上我的请求比我的例子复杂得多。例如,还有子查询。 - cheb1k4
2个回答

13

BigDecimalDouble 都是继承自 Number,所以你可以这样做:


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

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


也许是最好的解决办法。我会尽快尝试它。 - cheb1k4
2
在我看来,这绝对是最安全的解决方案。 - Max

-1

你可以这样做

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接