应该很简单,但是我现在真的很困惑

我有一个数据库查询:

   public double markingAvg(Marking id) {
        System.out.println("In MarkingAvg");
        System.out.println("id = " + id);
        System.out.println("id = " + id.getId());
        Query m = em.createQuery("SELECT m.markSectionOne, m.markSectionTwo, m.markSectionThree, m.markSectionFour, m.markSectionFive, m.markSectionSix, m.markSectionSeven, m.markSectionEight, m.markSectionNine, m.markSectionTen, m.markSectionEleven, m.markSectionTwelve, m.markSectionThirteen FROM MARKING m WHERE m.id = :id", Double.class);
        m.setParameter("id", id.getId()); // Note the getId()
        System.out.println(m);


        List<Object[]> allMarks = m.getResultList();
        double total = 0.0;
        int count = 0;

        for (Object[] marks : allMarks) {
            for (Object mark : marks) {
                total += Double.parseDouble((String) mark);
                ++count;
            }
        }
        return total / (double) count;
    }

它只是从13列中获取值并对其取平均值,但是当它们中有空值时会中断,有没有办法说出任何一列中是否有空值以将总计返回到为0? 谢谢

===============>>#1 票数:2 已采纳

您可以为此使用内联条件检查:

    total += Double.parseDouble((String) ((mark==null) ? 0 : mark)));

===============>>#2 票数:1

您也可以在查询中处理此问题:例如:

ij> CREATE TABLE T(I INT);
ij> INSERT INTO T VALUES 1, 2, 3, NULL;
4 rows inserted/updated/deleted
ij> SELECT * FROM T;
I          
-----------
1          
2          
3          
NULL       

4 rows selected
ij> SELECT (CASE WHEN I IS NULL THEN 0 ELSE I END) FROM T;
1          
-----------
1          
2          
3          
0          

4 rows selected

在您的情况下,用SQL计算平均值可能更好

ij> SELECT AVG(CAST(I AS DOUBLE)) AS AVERAGE FROM T;
AVERAGE                 
------------------------
2.0                     
WARNING 01003: Null values were eliminated from the argument of a column function.

1 row selected

注意警告。 如果您实际上希望NULL在平均值中计数为0,则必须使用上述CASE表达式。

===============>>#3 票数:0

将查询更改为以下内容:

SELECT NVL(m.markSectionOne,0), 
       NVL(m.markSectionTwo,0), 
       NVL(m.markSectionThree,0), 
       NVL(m.markSectionFour,0), 
       NVL(m.markSectionFive,0), 
       NVL(m.markSectionSix,0), 
       NVL(m.markSectionSeven,0),
       NVL(m.markSectionEight,0),
       NVL(m.markSectionNine,0), 
       NVL(m.markSectionTen,0),
       NVL(m.markSectionEleven,0), 
       NVL(m.markSectionTwelve,0),
       NVL(m.markSectionThirteen,0) 
FROM MARKING m WHERE m.id = :id;

  ask by user2061913 translate from so

未解决问题?本站智能推荐:

2回复

使用JPA在jpql中按时间戳分组

伙计们! 我正在尝试使用JPA(EclipseLink + Derby)在JPQL中按时间戳将查询结果分组,并将其用于创建Result对象。 我的查询是: 不幸的是,唯一的一个毫秒会产生很大的变化,因此按o.timeOfOrder进行简单分组是行不通的。 我已经尝试过这种方法
3回复

JPQL In子句错误-语句过于复杂

如果传递到“ IN”子句中的列表具有多个值,则下面的代码将爆炸。 在我的情况下,计数为1400个值。 客户表中也有数千(约100,000)条记录。 查询正在针对DERBY数据库执行。 如果列表具有较少的值(可能小于1000),并且由于in子句基于该子句执行而导致列表的custome
4回复

使用JPA中的MAX()无法使用SELECT查询获得正确的值

我是JPA的新手,当我尝试使用MAX()函数查询数据库时遇到问题。 我的功能代码如下。 谁能帮我? 谢谢。 我正在使用JPA,TopLink和Apache Derby。 我的方法应该返回表用户的最大id。 编辑:我从服务中调用该函数: user.setId()值始终
1回复

使用jpa jpql进行复杂的SQL查询

我将JPA2用于dao层。 假设我有一个如下表(只是一个示例): 根据给定表(实际上比这更复杂),我如何获得这样的结果 注意:状态也必须区分。 数据库中也不存在hours列,该列是start_time和end_time 所以任何人都可以对此有个好主意? 我不能按任
1回复

如何在JPA JPQL中编写此SQL select?

我有一个表 ,称为REI_BODY ,另一个,有一个表 REI_AMT_INFO 。 我在oracle pl / sql中有一个选择: 选择 *, 这是REI_AMT_INFO表, 没有外键! : 我必须用JPA JPQL语言创建此选择。 我该怎么办?
2回复

此jpql查询有什么问题?(JPA)

您能帮我在我的应用程序中的登录方法的JPQL查询中找到错误吗? 执行时出现此错误: 严重:JSF1073:在处理INVOKE_APPLICATION 5期间捕获到javax.faces.event.AbortProcessingException:UIComponent-Cli
1回复

JPA / JPQL插入与提取合二为一

我有一个带有自动递增的INT主键的表。 我正在寻找刚插入的行的此关键字段的值。 我能做到 1)通过使用LAST_INSERT_ID() 要么 2)仅通过我插入的值查询它。 但是,“感觉”是获得该价值的更直接的方法。 在上面的(1)中,它为我提供了最后插入
1回复

SQL子选择到jpql

如何用jpql语法编写此sql? 这是一个子选择。 如果尝试这样的操作,我会得到一个错误: SELECT sum(t1.preise)FROM(SELECT a.totalGRP FROM preise a)as t1 错误是意外令牌“(”
3回复

SQL查询TO JPQL之一

我正在尝试转换此SQL查询: 进入JPQL之一: 但结果是返回null 。 有关这个错误的任何想法?
1回复

使用openJPA的JPA查询仅可用作“本机” SQL,但当转换为JPQL或JPA标准时则不起作用

我有一个SQL查询和类的映射。 使用openJPA,如果将查询作为@NamedNativeQuery进行,则可以正常工作,返回对应的类和预期的结果。 如果将其转换为JPQL @NamedQuery,它将始终为getSingleResult方法返回NoResultException。 我还尝