使用Hibernate SQLQuery的AVG函数中的NullPointerException

时间:2015-02-19 20:52:57

标签: java sql spring hibernate nullpointerexception

我想从带有Hibernate SQLQuery的Column中获取Average值。我试试

@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不存在于表中时,我得到一个NullPointerException ...然后,我在控制器中尝试:

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

但我再次得到NullPointerException。我进行了调试,并在SQLQuery中生成异常。如果表格中没有prodId,我如何将评级设置为零?

2 个答案:

答案 0 :(得分:3)

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

这是有道理的,因为未定义0值的avg值(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();

答案 1 :(得分:0)

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