что лучше: getSingleResult или getResultList JPA - PullRequest
11 голосов
/ 14 декабря 2011

Мне нужно извлечь одну строку из таблицы, и мне было интересно, какой подход лучше. С одной стороны getSingleResult предназначен для получения одного результата, но это вызывает исключение. Есть ли у этого метода преимущества в производительности, связанные с getResultList с

query.setFirstResult(0);
query.setMaxResults(1); 

Ответы [ 5 ]

19 голосов
/ 23 августа 2012

Согласно «Эффективной Яве» Джошуа Блоха:

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

Кредит источнику: Почему вы никогда не должны использовать getSingleResult () в JPA

@Entity
@NamedQuery(name = "Country.findByName", 
            query = "SELECT c FROM Country c WHERE c.name = :name"
public class Country {
  @PersistenceContext
  transient EntityManager entityManager;

  public static Country findByName(String name) {
      List<Country> results = entityManager
            .createNamedQuery("Country.findByName", Country.class)
            .setParameter("name", name).getResultList();
      return results.isEmpty() ? null : results.get(0);
  }
}
10 голосов
/ 14 декабря 2011

getSingleResult выдает NonUniqueResultException, если имеется несколько строк.Он предназначен для извлечения одного результата, когда действительно один результат.

То, как вы это сделали, прекрасно, и JPA разработан для правильной обработки.В то же время вы никак не можете сравнить его с getSingleResult, так как он не будет работать.

Однако, в зависимости от кода, над которым вы работаете, всегда лучше уточнить запрос для возвратаединственный результат, если это все, что вы хотите - тогда вы можете просто позвонить getSingleResult.

3 голосов
/ 02 июля 2012

Есть альтернатива, которую я бы порекомендовал:

Query query = em.createQuery("your query");
List<Element> elementList = query.getResultList();
return CollectionUtils.isEmpty(elementList ) ? null : elementList.get(0);

Это гарантирует исключение Null Pointer, гарантирует, что возвращается только 1 результат.

1 голос
/ 30 августа 2016

В сочетании с fetch() использование setMaxResults(1) может привести к частично инициализированным объектам.Например,

CriteriaQuery<Individual> query = cb.createQuery(Individual.class);
Root<Individual> root = query.from(Individual.class);
root.fetch(Individual_.contacts);

query.where(cb.equal(root.get(Individual_.id), id));

Individual i = em.createQuery(query)
    .setMaxResults(1) // assertion fails if individual has 2 contacts
    .getResultList()
    .get(0);
assertEquals(2, i.getContacts().size());

Итак, я использую getResultList() без ограничений - немного неудовлетворительно.

1 голос
/ 11 сентября 2013

getSingleResult создает исключение NonUniqueResultException, если имеется несколько строк или нет каких-либо строк . Он предназначен для извлечения одного результата, когда действительно один результат.

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