使用 Hibernate SQLQuery 的 AVG 函数中的 NullPointerException

NullPointerException in AVG function with Hibernate SQLQuery

我想使用 Hibernate SQLQuery 从列中获取平均值。我试试

@Override
    public Double getRating(Long prodId) {
        return ((Number) getCurrentSession()
                .createSQLQuery("SELECT "
                        + "AVG(rating) "
                        + "FROM gio_prod_rating "
                        + "WHERE producto_id = :prodId")
                .setParameter("prodId", prodId)
                .uniqueResult()).doubleValue();
}

但是当 prodId 在 table 中不存在时,我得到一个 NullPointerException...然后,我在控制器中尝试:

Double rating = productoService.getRating(Long.parseLong(idproducto));
        if (rating==null) {
            rating = Double.parseDouble("0");
        }

但是我又遇到了 NullPointerException。我进行了调试,SQLQuery 中生成了异常。 table 中不存在 prodId 时如何将评分设置为零?

您确定它是由 sqlQuery 抛出的吗?我猜它来自 doubleValue()http://docs.oracle.com/javase/7/docs/api/java/lang/Number.html#doubleValue%28%29

AVG 函数 returns 如果没有匹配的行则为 NULL。 (cf. https://docs.oracle.com/cd/E17952_01/refman-5.1-en/group-by-functions.html#function_avg) 在其上调用 uniqueResult() 将导致 null,从而在调用 doubleValue 时导致 NullPointerException。

这是有道理的,因为 0 个值的平均值未定义(0/0 等...)。您可以做的是:

Number result = (Number) getCurrentSession()
                .createSQLQuery("SELECT "
                        + "AVG(rating) "
                        + "FROM gio_prod_rating "
                        + "WHERE producto_id = :prodId")
                .setParameter("prodId", prodId)
                .uniqueResult()
return result != null ? result.doubleValue() : DEFAULT_AVG_VALUE;

或与Java8:

return Optional.ofNullable(result).orElse(DEFAULT_AVG_VALUE).doubleValue();