2016-08-22 12 views
0

어제 나는 내 회사에서 새 프로젝트에 액세스 할 수있어 나는이 모든 활성 사용자를 찾을 수있는 좋은 방법이하면 마지막()

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

첫째, 두 옵션 모두 요구 사항을 충족합니다.

그러나 옵션 2은 Java 수준이 아닌 쿼리 수준에서 데이터를 필터링하는 것이 좋습니다. 이 구문을 백업 할 데이터는 없지만 성능은 두 번째 옵션에서 더 좋을 것이라고 생각합니다. 나는 나의 경험에 근거한 성과에 대해 논평했다.

캐시 (@Cacheable)를 사용할 수 있는지 여부를 고려해 볼 수도 있습니다. 이는 유스 케이스, 즉 User 엔티티가 얼마나 자주 변경되는지 그리고 얼마나 자주 캐시를 새로 고치고 싶은지에 달려 있습니다.

네이티브 쿼리를 사용할 때의 단점은 현재 Spring JPA가 네이티브 쿼리에 대한 동적 정렬 실행을 지원하지 않는다는 것입니다.

Hibernate와 매우 관련되어 있지만 아래 링크에서 논의되는 유사한 질문을 참조하십시오. 분명히 옵션 3이 선호됩니다 (즉, @Query 접근).

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