स्प्रिंग 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.