2015-09-08 8 views
15

संपादित करें: इस समस्या का समाधान इस सवाल के बारे में दूसरे और चौथे जवाब में प्रदान की जाती हैं setMaxResults for Spring-Data-JPA annotation?केवल प्रथम/अंतिम तत्व स्प्रिंग डाटा JPA और @query एनोटेशन का उपयोग कर लाई जा रही है

लक्ष्य: लायें सबसे बड़ा/सबसे छोटी एक वसंत डेटा जेपीए भंडार और वसंत क्वेरी एनोटेशन का उपयोग कर संपत्ति जेड द्वारा तत्व।

क्या मैं अब तक

@Query("SELECT xelement FROM x xelement ORDER BY xelement.z") 
public List<X> findFirstElement(); 

समस्या है: इस क्वेरी सभी तत्वों को हासिल करेगा (जो वास्तव में प्रभावी नहीं है)। अगर मैं EntityManager direcly का प्रयोग करेंगे, मैं करने के लिए

entityManager.setMaxResults(1) 

का उपयोग कर केवल पहला तत्व प्राप्त परिणामों की संख्या निश्चित कर सकता है।

प्रश्न: मैं @query एनोटेशन का उपयोग कर परिणाम की अधिकतम संख्या कैसे निर्दिष्ट करूँ?

आइडिया: आकार के पेजरक्वेट 0 का उपयोग करने का तरीका उपयोग कर रहा है?

बाधाएं: मुझे "FindFirstBy ...." क्वेरी सुविधा के बारे में पता है, लेकिन मैं @Query एनोटेशन का उपयोग करना चाहता/चाहती हूं।

+0

आपकी विधि 'सूची ' क्यों लौटाती है जब इसे केवल एक तत्व लौटने की उम्मीद है? यदि क्वेरी वास्तव में सरल है, तो आप '@ क्वेरी' का उपयोग करने से बच सकते हैं और बस 'findFirstOrderByZ() 'ढूंढ सकते हैं। अन्यथा, आपको 'LIMIT' कीवर्ड का उपयोग करना होगा, 'x.z LIMIT 1' द्वारा xelement x ORDER से X चुनें। – manish

+0

@manish: 1. सूची के संबंध में, यह केवल लचीला होना था अगर मैं वस्तुओं की मनमानी संख्या स्विच करता, लेकिन हां, सिद्धांत रूप में आप सही हैं, इस मामले में एक सूची लौटना अधिक है। 2. "ढूंढें सबसे पहले .." -> बाधाओं को देखें। 3. क्या आप सुनिश्चित हैं कि सीमा कीवर्ड जेपीक्यूएल में उपलब्ध है? मुझे लगता है कि मुझे इसे जांचना है .... मैंने http://stackoverflow.com/questions/9314078/setmaxresults-for-spring-data-jpa-annotation भी पाया जो समस्या को हल करता है। –

+0

इसे [http: // stackoverflow में दूसरे और चौथे उत्तर से ढंकने के लिए मिला।com/प्रश्न/9314078/setmaxresults के लिए वसंत-डेटा-जेपीए-एनोटेशन] [1] [1]: http://stackoverflow.com/questions/9314078/setmaxresults-for-spring-data -jpa-annotation –

उत्तर

0

यह करने के लिए प्रयास करें:

@Query(value = "SELECT xelement FROM x xelement ORDER BY xelement.z LIMIT 1", 
     nativeQuery = true) 
+0

मुझे लगता है कि आपने पहले से ही एक संपादन को पूर्ववत कर दिया है जहां किसी ने आपकी अंग्रेजी को सही किया है, लेकिन "इसे आजमाएं" यहां "बेहतर करने की कोशिश करें" से कहीं बेहतर अंग्रेजी है। (मैं एक मूल ब्रिटिश अंग्रेजी स्पीकर हूं।) आपका वाक्यांश लगता है जैसे आप सही रूप से अनिश्चित हैं - इस मामले में यह कोई टिप्पणी नहीं होनी चाहिए बल्कि एक जवाब होना चाहिए। –

+1

मुझे लगता है कि यह अंग्रेजी व्याकरण की जांच के लिए एक साइट नहीं है .... –

4

तुम बस एनोटेशन @query को nativeQuery जोड़कर एसक्यूएल की सीमा संपत्ति का उपयोग कर सकते हैं। हालांकि, ऐसा करने का एक और बेहतर तरीका है। अपने भंडार विधि में पृष्ठांकन योग्य वर्ग अपने @query एनोटेशन बिना छुए आपकी समस्या का समाधान होगा: इस प्रकार

@Query(value = "SELECT xelement FROM x xelement ORDER BY xelement.z") 
List<X> findFirstElement(Pageable limit); 

सीमा निर्धारित और ऑफसेट करने के लिए, उपयोग इस भंडार विधि कॉल करना चाहिए:

List<X> xValues = xRepository.findFirstElement(new PageRequest(0, 1)); 

यहाँ 1 मेल खाती है जो सीमा आप चाहते हैं।

1

निकटतम जेपीए क्वेरी सिंटैक्स मैं आपके उपयोग के मामले के बारे में सोच सकता हूं findFirstByZIsNotNullOrderByZAsc है। यह कस्टम मूल क्वेरी लिखने की आवश्यकता को खत्म करना चाहिए।

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