java - JPA native 查询返回 Double 或 BigDecimal

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

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

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

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

最佳答案

BigDecimalDouble 都扩展了 Number,因此您可以:

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

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

关于java - JPA native 查询返回 Double 或 BigDecimal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34786148/

相关文章:

java.time.format.DateTimeParseException : Unable to obtain ZonedDateTime from TemporalAccessor in format ddMMyyyyhhmmss

sql - 空间数据 SQL 重投影函数问题

java - 每个实体的 Hibernate 命名策略

postgresql - 如何在 Npgsql 中使用 hstore 列类型?

java - 如何使用JAXB将数据写入XML文件?

mysql - Hibernate 不关闭 MySql 连接

java - Spring Boot 不会替换 Spring Tool Suite 版本 : 3. 8.4.RELEASE 中的系统变量 {user.home}

java - 如何给用户错误信息?

java - 我如何知道 protobuf 的 json 格式应该是什么样的?

postgresql - Postgres 数据库复制未实时显示