2015-11-11 14 views
9

के साथ डेटा फ़िल्टर करना मेरे पास एक साधारण आरईएसटी सेवा है जो स्प्रिंग बूट CrudRepository के साथ डेटा तक पहुंचती है।स्प्रिंग बूट क्रूड रिपोजिटरी

यह भंडार पहले से ही पृष्ठांकन और छँटाई क्षमताओं इस तरह लागू करता है:

public interface FlightRepository extends CrudRepository<Flight, Long> { 
    List<Flight> findAll(Pageable pageable); 
} 

यह कॉलिंग:

Sort sort = new Sort(direction, ordering); 
PageRequest page = new PageRequest(xoffset, xbase, sort); 

return flightRepo.findAll(page); 

मैं भी इस भंडार को छानने में जोड़ना चाहते हैं (उदाहरण के लिए id > 13 AND id < 27 के साथ ही संस्थाओं वापसी)। CrudRepository इस कार्यक्षमता का समर्थन नहीं करता प्रतीत होता है। क्या यह कुछ तरीका है कि इसे कैसे प्राप्त किया जाए या क्या मुझे अलग-अलग दृष्टिकोण का उपयोग करने की आवश्यकता है?

किसी भी सुझाव के लिए धन्यवाद!

उत्तर

7

एक विकल्प, जो पैरामीटर के प्रत्येक संयोजन के लिए क्वेरी विधियों को बनाने के बारे में उपरोक्त टिप्पणियों में आपकी चिंता का समाधान करेगा, या तो मानदंड API या उसके द्वारा विशिष्टता पैटर्न का उपयोग करना है QueryDSL का उपयोग कर। और कहा कि दूसरी बात है - - प्रश्नों को परिभाषित एक निश्चित सेट

क्वेरी तरीकों बड़ा अनुप्रयोगों क्योंकि के लिए हो जाना हो सकता है की संख्या:

दोनों दृष्टिकोण चिंता के जवाब में नीचे है कि कम से दिए गए हैं मानदंडों का। इन दो दोषों से बचने के लिए, क्या यह अच्छा नहीं होगा यदि आप परमाणु भविष्यवाणियों के एक सेट के साथ आ सकते हैं कि आप गतिशील रूप से अपनी क्वेरी बनाने के लिए जोड़ सकते हैं?

https://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/

मैं QueryDSL थोड़ा आसान के साथ काम करने लगता है। आपको केवल एक इंटरफ़ेस विधि परिभाषित करने की आवश्यकता है जिसे आप पैरामीटर के किसी भी संयोजन को भविष्यवाणी के रूप में पास कर सकते हैं।

उदा।

public interface UserRepository extends PagingAndSortingRepository<User, Long>, QueryDslPredicateExecutor<User> { 
    public List<User> findAll(Predicate predicate); 
} 

और क्वेरी करने के लिए:

repository.findAll(QUser.user.address.town.eq("Glasgow").and(QUser.user.gender.eq(Gender.M))); 

repository.findAll(QUser.user.address.town.eq("Edinburgh")); 

repository.findAll(QUser.user.foreName.eq("Jim")); 

जहां QUser एक QueryDSL स्वत: जनरेट वर्ग है।

http://docs.spring.io/spring-data/jpa/docs/current/api/index.html?org/springframework/data/jpa/repository/support/QueryDslRepositorySupport.html

http://www.querydsl.com/static/querydsl/2.1.0/reference/html/ch02s02.html

अद्यतन

स्प्रिंग डाटा मॉड्यूल के गोसलिंग रिलीज से अब एक वेब अनुप्रयोग में HTTP मानकों से स्वत: विधेय पीढ़ी के लिए समर्थन नहीं है।

https://spring.io/blog/2015/09/04/what-s-new-in-spring-data-release-gosling#querydsl-web-support

0

अपने भंडार [EDITED]

Page<Flight> findByIdBetween(Long start, Long end, Pageable pageable) 

में नीचे समारोह घोषित तो फिर तुम भंडार के कहने से इस समारोह आह्वान कर सकते हैं। अधिक जानकारी के लिए कृपया spring-data reference देखें ..

+0

क्या इसे पेजेबल के साथ जोड़ा जा सकता है? मैं उम्मीद कर रहा था कि मैं इसे किसी ऑब्जेक्ट में निर्दिष्ट कर सकता हूं और इसे फ़ंक्शन पर भेज सकता हूं। कुछ लचीलापन चाहते समय यह बहुत आसान नहीं है (उपयोगकर्ता फ़िल्टर किए जाने के लिए कस्टम फ़ील्ड निर्दिष्ट कर सकता है और मुझे हर संभव संयोजन के लिए इस तरह का एक फ़ंक्शन निर्दिष्ट करना होगा ...) – Smajl

+0

हां, आप सिम्पी का उपयोग कर सकते हैं 'सूची findByIdBetween (लंबी शुरुआत , लांग एंड, पेजेबल पेजेबल) ' – pezetem

+0

आपको विस्तारित इंटरफेस को 'पेजिंग एंड सोर्सिंग रिपोजिटरी' में बदलने की भी सिफारिश करता है .. –