2016-08-22 2 views
0

Вчера я получил доступ к новому проекту в моей компании, и я нашел этоfinall() в пружине услуг

public List<User> findNotActiveUsers() { 
    return this.userRepository.findAll().splititerator() 
      .filter(u -> u.isActive()) 
      .collect(Collect.toList()); 
} 

Это хороший способ, чтобы найти все активные пользователи? Или это должно быть сделано в таком репозитории?

public interface UserRepository extends JpaRepository<Long, User> { 
    @Query("SELECT user FROM User user WHERE user.active IS TRUE") 
    List<User> findActiveUsers(); 
} 

И если первое решение является правильным, то что касается производительности?

ответ

1

Во-первых, оба варианта соответствуют требованию.

Однако опция имеет смысл фильтровать данные на уровне запросов, а не на уровне Java. Я считаю, что производительность будет лучше во втором варианте, хотя у меня нет данных для резервного копирования этого утверждения. Я прокомментировал результаты, основанные на моем опыте.

Вы также можете рассмотреть возможность использования кеша (@Cacheable). Это зависит исключительно от использования, то есть, как часто изменяется пользовательский объект и как часто вы хотите обновить кеш.

Одним из недостатков использования собственного запроса является то, что в настоящее время Spring JPA не поддерживает выполнение динамической сортировки для собственных запросов.

Пожалуйста, обратитесь к аналогичному вопросу, обсуждаемому в приведенной ниже ссылке, хотя он очень сильно связан с Hibernate. Очевидно, что вариант 3 является предпочтительным (т. Е. Подход @Query).

Spring Data Repository with ORM, EntityManager, @Query, what is the most elegant way to deal with custom SQL queries?

Смежные вопросы