JPA getSingleResult () или пустой указатель

Я имею insertOrUpdate метод, который вставляет Entity когда это не существует или обновляет его, если это делает. Для включения этого я имею к findByIdAndForeignKey, если это возвратилось null вставьте, если не затем обновляют. Проблема состоит в том, как я проверяю, существует ли она? Таким образом, я попробовал getSingleResult. Но это выдает исключение если

public Profile findByUserNameAndPropertyName(String userName, String propertyName) {
    String namedQuery = Profile.class.getSimpleName() + ".findByUserNameAndPropertyName";
    Query query = entityManager.createNamedQuery(namedQuery);
    query.setParameter("name", userName);
    query.setParameter("propName", propertyName);
    Object result = query.getSingleResult();
    if (result == null) return null;
    return (Profile) result;
}

но getSingleResult броски Exception.

Спасибо

128
задан dur 30 April 2016 в 18:31
поделиться

3 ответа

Бросая исключение, getSingleResult() указывает на то, что его нельзя найти. Лично я не выношу такого рода API. Это заставляет работать с поддельными исключениями без какой-либо реальной пользы. Нужно просто обернуть код в блок try-catch.

Альтернативно можно запросить список и посмотреть, не пуст ли он. Это не бросает исключение. На самом деле, так как вы не делаете первичного поиска ключей технически, то может быть несколько результатов (даже если один, оба или комбинация ваших посторонних ключей или ограничений делает это невозможным на практике), так что это, вероятно, более подходящее решение.

.
247
ответ дан 24 November 2019 в 00:34
поделиться

Так что не делайте этого!

У вас есть два варианта:

  1. Выполнить выборку для получения COUNT вашего результирующего множества и вытягивать данные только в том случае, если этот счет не нулевой; или

  2. Использовать другой вид запроса (который получает результирующий множество) и проверить, есть ли у него 0 или более результатов. Он должен иметь 1, так что вытащите его из своего результирующего набора и все.

Я бы пошел со вторым предложением, соглашаясь с Клетусом. Оно дает лучшую производительность, чем (потенциально) 2 запроса. Также меньше работы.

4
ответ дан 24 November 2019 в 00:34
поделиться

Я заключил логику в следующий вспомогательный метод.

public class JpaResultHelper {
    public static Object getSingleResultOrNull(Query query){
        List results = query.getResultList();
        if (results.isEmpty()) return null;
        else if (results.size() == 1) return results.get(0);
        throw new NonUniqueResultException();
    }
}
32
ответ дан 24 November 2019 в 00:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: