【发布时间】:2016-04-19 13:49:23
【问题描述】:
我有下面的简单代码:
@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) {
...
}
无论我的运行环境如何,有没有办法始终拥有相同的实例?
【问题讨论】:
-
您可以使用双精度代替数字以获取更多详细信息,请参阅:postgresql.org/docs/9.4/static/…
-
我认为这不是一个好的解决方案,因为它表明了这一点:
If you require exact storage and calculations (such as for monetary amounts), use the numeric type instead. -
为什么对 JPQL 支持的东西使用原生查询(假设“mytable”有一个实体)...
-
@NeilStockton 因为实际上我的请求比我的示例中的请求复杂得多。例如有子查询。
标签: java postgresql jpa wildfly-9