2016-11-03 16 views
8

जावा 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? 
    } 

} 

जाहिर है मैं एक sublist का उपयोग करें और मैन्युअल रूप से डाल सकता है पेज आकार इत्यादि। लेकिन मुझे लगता है कि ऐसा करने के लिए एक और "मानक" तरीका होना चाहिए?

+1

मैंने सोचा होगा कि 'collect.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 उदाहरणों की आवश्यकता होती है तो बस विधेय आह्वान करने के लिए होगा के रूप में बिंदु को नष्ट कर रहा है। आप निश्चित रूप से डेटाबेस को देना चाहते हैं जो केवल उन मानों को वापस कर दें जो पहले स्थान पर मेल खाते हैं।

संबंधित मुद्दे