स्प्रिंग CrudRepository find


169

स्प्रिंग क्रूड रिपेरिटरी में, क्या हमारे पास एक क्षेत्र के लिए "इन क्लॉज" के लिए समर्थन है? यानी निम्नलिखित के समान कुछ?

 findByInventoryIds(List<Long> inventoryIdList) 

यदि ऐसा समर्थन उपलब्ध नहीं है, तो क्या सुरुचिपूर्ण विकल्प पर विचार किया जा सकता है? प्रत्येक आईडी के लिए फायरिंग क्वेरी इष्टतम नहीं हो सकती है।

जवाबों:


283

findByInventoryIdIn(List<Long> inventoryIdList) चाल चलनी चाहिए।

HTTP अनुरोध पैरामीटर प्रारूप इस तरह होगा:

Yes ?id=1,2,3
No  ?id=1&id=2&id=3

जेपीए रिपॉजिटरी कीवर्ड की पूरी सूची वर्तमान प्रलेखन सूची में पाई जा सकती है । यह दर्शाता है कि IsInसमतुल्य है - यदि आप पठनीयता के लिए क्रिया पसंद करते हैं - और यह कि जेपीए भी समर्थन करता है NotInऔर IsNotIn


धन्यवाद, ठीक यही मैं ढूंढ रहा था। क्या उनके पास CrudRepository पृष्ठ में दस्तावेज है, या कोड को पढ़कर पता चलता है?
एस्प्रेसो

1
यह वास्तव में संदर्भ प्रलेखन में सूचीबद्ध है ।
ओलिवर ड्रोट्बोहम

धन्यवाद। यह "रत्न परिशिष्ट B में छिपा है", ठीक है :)
एस्प्रेसो


1
विधि हस्ताक्षर के लिए: सूची <व्यक्ति> findByIdIn (सूची <पूर्णांक> आईडी); मुझे त्रुटि मिलती है: इसके कारण: java.lang.NumberFormatException: इनपुट स्ट्रिंग के लिए: "(1, 2)"
user64141

103

स्प्रिंग क्रूड रिपेरिटरी में किसी भी विधि के लिए आपको खुद को @Query निर्दिष्ट करने में सक्षम होना चाहिए। कुछ इस तरह काम करना चाहिए:

@Query( "select o from MyObject o where inventoryId in :ids" )
List<MyObject> findByInventoryIds(@Param("ids") List<Long> inventoryIdList);

धन्यवाद, यह काम करता है। एक "अधिक क्लीनर" समाधान के लिए देख रहा था यानी @Query लिखने के बिना।
एस्प्रेसो

3
ओलिवर गिएर्के वह शख्स हैं जो इसका जवाब जानते हैं और उनके पास "अधिक क्लीनर" समाधान है। आपको उसका उत्तर स्वीकार करना चाहिए।
digitaljoel

1
महान! मैंने Set<String>एक पैरामीटर के रूप में उपयोग किया , अच्छी तरह से काम किया।
ब्लूबर्ड

क्या होगा अगर मैं अपनी विधि एक सूची और अन्य सामान्य स्ट्रिंग के लिए 2 पैरामीटर्स पास करना चाहता हूं, तो क्या वह काम करेगा? यदि हाँ, तो मुझे अपनी विधि का नाम कैसे देना चाहिए
user3614936

22

हाँ, यह समर्थित है।

विधि नाम के अंदर समर्थित कीवर्ड के लिए यहां दिए गए दस्तावेज़ीकरण की जांच करें ।

आप केवल @Query एनोटेशन का उपयोग किए बिना और अपने कस्टम क्वेरी को लिखे बिना रिपॉजिटरी इंटरफ़ेस में विधि को परिभाषित कर सकते हैं । आपके मामले में यह इस प्रकार होगा:

List<Inventory> findByIdIn(List<Long> ids);

मुझे लगता है कि आपके पास इन्वेंटरी इकाई और इन्वेंटरी रिपोजिटरी इंटरफ़ेस है। आपके मामले का कोड इस तरह दिखना चाहिए:

सत्ता

@Entity
public class Inventory implements Serializable {

  private static final long serialVersionUID = 1L;

  private Long id;

  // other fields
  // getters/setters

}

रिपोजिटरी

@Repository
@Transactional
public interface InventoryRepository extends PagingAndSortingRepository<Inventory, Long> {

  List<Inventory> findByIdIn(List<Long> ids);

}

यह उन सभी इंटरफेस के लिए काम करता है जो CrudRepository इंटरफ़ेस का विस्तार कर रहे हैं ।
दिज़िनॉट

1
अगर डीबी के आधार पर आईडी का आकार 1000 या कुछ से अधिक है, तो यह काम नहीं करेगा। इस बारे में कैसा है? सूची <सूची> findByIdIn (सूची <लंबी> आईडी, पृष्ठ पर अंक लगाने योग्य);
जूली
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.