【问题标题】:Java Handling NPE in Spring Data native query ProjectionsJava 处理 Spring Data 本机查询投影中的 NPE
【发布时间】:2020-07-12 08:38:49
【问题描述】:

我想知道是否有一种方法可以检查本机查询的结果对象是否包含所有空值。例如。以下代码尝试使用 nativeQuery 获取投影,但由于所有字段均为空,因此会引发 NPE。

投影:

public interface MetricsCountData {
    Long getLikes ();

    Long getComments ();

    Long getImpressions ();

    Long getShares ();
}

存储方法:

@Query(nativeQuery = true, value = "select sum(impressions) as impressions, sum(likes) as likes, sum(comments) as comments, sum(shares) as shares " +
            "from facebook_post_analytics As a " +
            "JOIN " +
            "(select post_id, max(id) As id " +
            "from facebook_post_analytics " +
            "where partner_id = :partnerId " +
            "AND page_id = :pageId " +
            "AND insights_epoch BETWEEN :startEpoch AND :endEpoch " +
            "group by post_id) AS b " +
            "ON a.id = b.id")
    MetricsCountData findFacebookMetricsData(Long partnerId, String pageId, Long startEpoch, Long endEpoch);

我的服务类中的片段:

MetricsCountData metricsCountData = dataRepository.findFacebookMetricsData(partnerId,pageId,startEpoch,endEpoch);

if(metricsCountData == null)                        //Useless Check
{
    return;
}else{
    return metricsCountData.getImpressions() + metricsCountData.getLikes();       //Representative Logic
}

现在,有没有一种方法可以轻松检查所有投影 getter 是否为 null,因为 metricsCountObject 始终为非 null,我总是进入 else 流并在那里获取 NPE。

注意:我的投影中有很多吸气剂,因此可以避免对每个吸气剂进行事先的空检查。另外,我尝试过使用Object[],它也有同样的问题。

有没有更好的办法?

任何帮助将不胜感激。

【问题讨论】:

  • 如果metricsCountData != null,你如何在 else 块中获取 NPE?您可能希望在未找到 MetricsCountData 时通知控制器并抛出自定义异常而不是返回。
  • metricsCountObject 总是非空的,我总是进入 else 流并在那里获取 NPE。
  • 你怎么能从同一个方法返回什么也不返回一个数字?这样可以编译吗?

标签: java hibernate spring-data-jpa spring-data nativequery


【解决方案1】:

您可以在 java 端签入:

if(metricsCountData == null || metricsCountData.getImpressions() == null || metricsCountData.getLikes() == null)                        //Useless Check
{
    return;
}else{
    return metricsCountData.getImpressions() + metricsCountData.getLikes();       //Representative Logic
}

或者在 SQL 端通过在查询中添加 HAVING 子句:

HAVING sum(impressions) IS NOT NULL AND sum(likes) IS NOT NULL

代码 sn-ps 只考虑印象和喜欢,但您显然也可以将其扩展到其他属性。

【讨论】:

    猜你喜欢
    • 2018-12-16
    • 2022-12-02
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    相关资源
    最近更新 更多