Java Обработка NPE в Spring Data. - PullRequest
0 голосов
/ 31 марта 2020

Мне интересно, есть ли способ проверить, содержит ли объект результата нативного запроса все нули. Например, следующий код пытается получить проекцию с использованием 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
}

Теперь есть способ легко проверить, являются ли все получатели проекций нулевыми, потому что metricsCountObject всегда ненулевой, и я неизменно иду внутрь другого потока и получаю NPE там.

Примечание: у меня есть много геттеров в моей проекции, поэтому не нужно делать предварительную нулевую проверку для каждого из них. Кроме того, я попытался использовать Object [], он тоже имеет ту же проблему.

Есть ли лучший способ?

Любая помощь будет высоко ценится.

1 Ответ

0 голосов
/ 01 апреля 2020

Вы можете выполнить регистрацию на стороне 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

Фрагменты кода учитывают только показы и лайки, но вы, очевидно, можете распространить это и на другие свойства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...