Java 处理 Spring Data 原生查询中的 NPE 投影

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

我想知道是否有一种方法可以检查 native 查询的结果对象是否包含所有空值。例如。以下代码尝试使用 nativeQuery 获取投影,但由于所有字段均为 null,因此它会抛出 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。

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

有更好的方法吗?

任何帮助将不胜感激。

最佳答案

您可以在 java 端 checkin :

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

代码片段仅考虑展示次数和点赞次数,但显然您也可以将其扩展到其他属性。

关于Java 处理 Spring Data 原生查询中的 NPE 投影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60956612/

相关文章:

java - Java 中的 Casting 是否有任何运行时成本?

java - NullPointEreException 选项卡布局 GridView

java - 使用 hibernate-search 索引 Enum 类型字段

spring-boot - Spring Data Elasticsearch没有给出预期的结果

java - 如何在 Spring Data JPA 中保存期间避免选择语句

spring-data - @EnableJpaRepositories.enableDefaultTransactions = false 不起作用

java - ant + yuicompressor路径错误

java - 无法将 (int, double) 对添加到 HashMap<Integer, Double>

java - JPA @ManyToOne - EntityNotFoundException 或 null 值?

java - 使用 Oracle 10g 时 Hibernate 的浮点列模式验证已知问题的最佳解决方法是什么?