【问题标题】:In which cases the return type is java.math.BigDecimal for a native query with "Select count(columnName) ..."在这种情况下,对于带有“Select count(columnName) ...”的本机查询,返回类型是 java.math.BigDecimal
【发布时间】:2014-08-21 12:32:35
【问题描述】:

我正在使用这样的本机查询:

public Long count() {  
String sql = "SELECT COUNT(t.task_id_t100) from T100_TASK t ";  
Query query = entityManager.createNativeQuery(sql);  
return (Long) query.getSingleResult();  
} 

这总是有效的。今天我收到了ClassCastException,因为query.getSingleResult() 返回了BigDecimal。我不记得改变了什么。

answer 中的提示告诉Note that in some cases result type may depend on the database, i.e. it can be something like BigDecimal

在哪些情况下?

【问题讨论】:

  • 有些 RDBMS 将返回 BigDecimal 的等价物,有些则不会。这是 RDBMS 供应商没有实现对“标准 SQL”的相同解释的缺点之一。您是否更改了 RDBMS?更安全地查看返回时它是什么类型并相应地进行转换
  • 我认为最好的方法是将其返回/转换为Number,并使用longValue() 方法。
  • Number.longValue() 工作正常。 @NeilStockton 没有。 rdbms 没有改变。因此问题。这是一种奇怪的行为。

标签: java sql jpa


【解决方案1】:

您可以简单地询问对象它是哪个类...

public Long count() {  
    String sql = "SELECT COUNT(t.task_id_t100) from T100_TASK t ";  
    Query query = entityManager.createNativeQuery(sql);  
    Object o = query.getSingleResult(); 
    //for BigDecimal
    if (o.getClass().equals(BigDecimal.class) ){
        BigDecimal big = (BigDecimal) o;
        return handleBigDecimal(big); //TODO
    }
    //other types might follow
    return (Long) o;  
} 

但请记住 - bigDecimal 可以比 long 大得多...(可以...不能保证)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多