2016-11-03 97 views
8

可以說我有以下系統信息庫:春數據JPA庫與Java 8流

public interface UserRepository extends JpaRepository<User, Long> { 

    @Query("select u from User u") 
    Stream<User> streamAllPaged(Pageable pageable); 
} 

我要執行搜索:

public Page<User> findAllUsers(Pageable page) { 

    Page<User> page = null; 
    try (Stream<User> users = userRepository.streamAllPaged(page)) { 
      Set<User> users = users.filter(u -> user.getName().equals("foo")) 
        .collect(Collectors.toSet()); 
      //create page from set? 
    } 

} 

很顯然,我可以使用一個子表和手動插入頁面大小等,但我想應該有一個更「標準」的方式來做到這一點?

+1

我會想'Collectors.partitioningBy'可以幫助,但是如果沒有訪問流中的位置,就不會看到如何。 – Aaron

+1

如果你不介意使用另一個流,[這個問題](http://stackoverflow.com/questions/29273705/how-to-paginate-a-list-of-objects-in-java-8)有回答。 – Aaron

回答

11

我認爲你的用例在這裏沒有太多意義。如果您最終想要結果爲Page,那麼從Stream開始的效率不高。你可以很容易地實現這個預期的最終結果:

public interface UserRepository extends CrudRepository<User, Long> { 

    Page<User> findByName(String name, Pageable pageable); 
} 

這會確保你只讀名稱的最初要求的金額。在這裏使用Stream完全顛覆了這一點,因爲要對Stream進行過濾將需要將全部User實例加載到內存中以調用謂詞。你一定要讓數據庫做到只返回首先匹配的值。