我想从带有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,我如何将评级设置为零?
答案 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