4

以下の簡単なコードがあります。

@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列はです。mytablenumeric(10,3)

次のような醜いコードは避けたいです。

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

実行環境に関係なく、常に同じインスタンスを持つ方法はありますか?

4

2 に答える 2

12

BigDecimalDoubleextendsの両方Numberなので、次のことができます。

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

プリミティブ型が必要な場合に使用resultAsDoubleしますが、正確な精度を維持する必要はありませんresultAsBigDecimal。それ以外の場合は使用してください。

于 2016-01-14T13:55:23.027 に答える
-1

あなたはこれを行うことができます

String sql = "SELECT SUM(power) FROM mytable";
Query q = em.createNativeQuery(sql);
BigDecimal result = (BigDecimal)q.getSingleResult();
于 2017-01-27T21:41:53.427 に答える