java - JPA/Hibernate 返回 BigDecimal 不长

标签 java hibernate jpa

我正在计算按月分组的 SUM

Query q = entityManager.createNativeQuery(qlString);
q.setParameter("program", program);
@SuppressWarnings("unchecked")
List<Long> resultList = (List<Long>) q.getResultList();
long tend = System.currentTimeMillis();

当我将两个结果列表(closed:已关闭项目的结果列表,closedLate:已关闭项目的结果列表)传入计算百分比的方法时,我得到了

 javax.servlet.ServletException: java.lang.ClassCastException: java.math.BigDecimal cannot be cast to java.lang.Long

.

private List<Long> computeOTR(List<Long> closed, List<Long> closedLate) {
    List<Long> monthlyOTR = new ArrayList<Long>();
    long numerator;
    Long denominator;
    for (int i = 0; i <11; i++) {
        numerator = closed.get(i) - closedLate.get(i); <----java.lang.ClassCastException
        denominator = closed.get(i);
        long percentage = (int)(numerator * 100.0 / denominator + 0.5);
        monthlyOTR.add(i, percentage);
    }
    return monthlyOTR;

在 Eclipse Debug模式下,关闭显示为 BigDecimal。为什么我decalre的时候会这样

List<Long> resultList = (List<Long>) q.getResultList();

编辑-Hibernate 查询:

public List<Long> findClosedLateByProgram(String program) {

    long tstart = System.currentTimeMillis();
    //@formatter:off
    String qlString = "with PRJ as ( " +
            "select  trunc(END_DATE) as END_DATE,  " +
            "trunc(NEED_DATE) as NEED_DATE   " +
            "from (SELECT UNIQUE * FROM TEST where PROGRAM_NAME = :program " +
            "AND ACTION_BY_ORG = 'AAA') " +
            "),  " +
            "DATES as ( select add_months(trunc(last_day(SYSDATE)), level-7) as thedate  " +
            "from dual connect by level <= 12  )   " +
            "SELECT nvl(sum(case when NEED_DATE <  trunc(thedate,'mm') AND END_DATE between trunc(thedate,'mm') and thedate then 1 end), 0 ) as CLOSED_LATE  " +
            "FROM  DATES, PRJ  " +
            "GROUP BY thedate ORDER BY thedate";
    //@formatter:on

    Query q = entityManager.createNativeQuery(qlString);
    q.setParameter("program", program);
    // q.setParameter("today",date, TemporalType.DATE);

    @SuppressWarnings("unchecked")
    List<Long> resultList =  q.getResultList();
    long tend = System.currentTimeMillis();
    long elapsed = tend-tstart;
    System.out.println("Elapsed Time For Closed But Late: " + elapsed);
    return resultList;
}

编辑 2

我想我受困于 BigDecimal? http://weblogs.java.net/blog/mb124283/archive/2007/04/java_persistenc.html

最佳答案

您应该已经收到一条警告,表明您的类型转换并未真正全面检查内容。 Type erasure意味着在执行时,List<Long> 之间没有区别和一个 List<BigDecimal> .所以转换成功了,只是后面的隐式转换为Long失败了。

基本上您需要更改查询以确保它创建 Long值代替。

关于java - JPA/Hibernate 返回 BigDecimal 不长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15345440/

相关文章:

Java:InputStream.read不等待输入?

java - jackson 将特殊字符映射为空

java - 如何在任何浏览器的保存/另存为弹出功能上将默认的保存/另存为路径修改为我们定义的路径?

java - 使用 IKVM 和 ikvmc hibernate

java - JPA Criteria API "IN"谓词不起作用

java - JPA CriteriaQuery - 重音不敏感

java - 无法通过 UDP protobuf 将大于 127 的整数值从 C++ 发送到 Java

java - Hibernate 按条件映射的一对多映射

java - 缓存不一致 - 实体并不总是保留在缓存的集合中

Hibernate 3.6 - session.get() 与 session.load()