2012-04-08 10 views
11

मैं मोंगोडीबी के साथ स्प्रिंग डेटा के लिए नया हूं और अपने मोंगो रिपोजिटरी एक्सटेंशन इंटरफ़ेस के अंदर स्वचालित रूप से जेनरेट की गई क्वेरी विधि चाहता हूं जिसके लिए फ़िल्टरिंग, सॉर्टिंग और सीमित होना आवश्यक है।स्प्रिंग रिपोजिटरी इंटरफ़ेस में सॉर्ट() और सीमा() के साथ क्वेरी

क्वेरी इस तरह दिखता है:

public interface JobRepository extends MongoRepository<Job, String> { 
    @Query("{ state: 'ACTIVE', userId: ?0 }") 
    List<Job> findActiveByUserId(String userId); 

    // The next line is the problem, it wont work since 
    // it's not in the format @Query expects 
    @Query("find({state:'ACTIVE'}).sort({created:-1}).limit(1)") 
    Job findOneActiveOldest(); 

    ... 
} 

मुझे पता है कि एक आदेश छँटाई प्राप्त करने के लिए एक प्रश्न पद्धति के लिए एक क्रमबद्ध तर्क जोड़ सकते हैं लेकिन:

// 'created' is the field I need to sort against 

find({state:'ACTIVE'}).sort({created:-1}).limit(1) 

भंडार इंटरफ़ेस इस तरह दिखता है समस्या केवल एक ही वस्तु को सीमित कर रही है। क्या कस्टम JobRepositoryImpl लिखने के बिना ऐसा करना संभव है?

धन्यवाद

संपादित करें:

का उदाहरण है कि मैं क्या देख रहा हूँ:

@Query("{ state:'ACTIVE', $orderby: {created:-1}, $limit:1 }") 
Job findOneActiveOldest(); 

या

@Query("{ state:'ACTIVE' }") 
@Sort("{ created:-1 }") 
@Limit(1) 
Job findOneActiveOldest(); 

लेकिन यह स्पष्ट रूप से काम नहीं करता है :(

उत्तर

24

क्या है wro साथ एनजी:

public interface JobRepository extends MongoRepository<Job, String> { 

    @Query("{ state : 'ACTIVE' }") 
    Page<Job> findOneActiveOldest(Pageable pageable); 
} 

और इसे का उपयोग:

// Keep that in a constant if it stays the same 
PageRequest request = new PageRequest(0, 1, new Sort(Sort.Direction.DESC, "created")); 
Job job = repository.findOneActiveOldest(request).getContent().get(0); 
+0

धन्यवाद ओलिवर, यह मैं वास्तव में क्या ढूंढ रहा था। – m1h4

+2

मैं इतनी व्यस्त और सरल क्वेरी-जैसे समाधान की तलाश में व्यस्त था कि मैंने पेजेबल क्लास की जांच करने के लिए परेशान नहीं किया और महसूस किया कि यह सॉर्ट सॉर्ट-ऑफ के साथ संयोजन में .sort() और .limit() की कार्यक्षमताओं को लपेटता है एक मोंगो क्वेरी। – m1h4

+0

कोई समस्या नहीं, खुशी है कि यह आपके लिए काम करता है! :) –

7

बस ओलिवर जवाब के लिए एक सुधार जोड़ने, यह Direction.DESC और नहीं Directions.DESC है और पैरामीटर के आदेश गलत है।

बदलें:

PageRequest request = new PageRequest(0, 1, new Sort("created", Directions.DESC)); 

रहे हैं:

PageRequest request = new PageRequest(0, 1, new Sort(Direction.DESC, "created")); 
+7

यह एक टिप्पणी होना चाहिए और उत्तर नहीं होना चाहिए। –

+0

या मूल उत्तर संपादित करें, लेकिन अब जब मैं इसके बारे में सोचता हूं, तो नए उपयोगकर्ताओं के पास टिप्पणी करने या संपादित करने का प्रतिनिधि नहीं होता है। – shoover

+0

@ सिनाटर देखें [यह चर्चा] (http://meta.stackoverflow.com/questions/260245/when-should-i-make-edits-to-code) मेटा पर, विशेष रूप से "उत्तर में संपादन कोड" अनुभाग। टीएल; डीआर: एसओ एक संदर्भ संसाधन है, एक खेल नहीं; संपादन को प्रोत्साहित किया जाता है अगर यह सुधार पैदा करता है; सभी संपादन लॉग हैं और कोई भी इतिहास की समीक्षा कर सकता है। – shoover

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