使用 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();
我想使用 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();