2016-08-22 37 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

首先,兩個選項都滿足要求。

但是,選項2更有意義的是在查詢級別而不是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?

相關問題