अनुपलब्ध CrudRepository # findOne विधि


101

मैं अपने प्रोजेक्ट में स्प्रिंग 5 का उपयोग कर रहा हूं। आज तक उपलब्ध विधि थी CrudRepository#findOne

लेकिन नवीनतम स्नैपशॉट डाउनलोड करने के बाद यह अचानक गायब हो गया! क्या कोई संदर्भ है कि विधि अभी उपलब्ध नहीं है?

मेरी निर्भरता सूची:

apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'


repositories {
    mavenCentral()
    maven { url "https://repo.spring.io/snapshot" }
    maven { url "https://repo.spring.io/milestone" }
}    

dependencies {
    compile 'org.springframework.boot:spring-boot-starter-data-jpa'

    runtime 'com.h2database:h2:1.4.194'
}

अपडेट करें:

लगता है कि इस विधि के साथ बदल दिया गया है CrudRepository#findById

जवाबों:


150

कृपया DATACMNS-944 देखें जो इस कमिट से जुड़ा है जिसमें निम्नलिखित नाम हैं

╔═════════════════════╦═══════════════════════╗
║      Old name       ║       New name        ║
╠═════════════════════╬═══════════════════════╣
║ findOne(…)          ║ findById(…)           ║
╠═════════════════════╬═══════════════════════╣
║ save(Iterable)      ║ saveAll(Iterable)     ║
╠═════════════════════╬═══════════════════════╣
║ findAll(Iterable)   ║ findAllById(…)        ║
╠═════════════════════╬═══════════════════════╣
║ delete(ID)          ║ deleteById(ID)        ║
╠═════════════════════╬═══════════════════════╣
║ delete(Iterable)    ║ deleteAll(Iterable)   ║
╠═════════════════════╬═══════════════════════╣
║ exists()            ║ existsById(…)         ║
╚═════════════════════╩═══════════════════════╝

1
क्या कोई माइग्रेशन गाइड मुझे याद किया गया है, या क्या यह घोषणाओं के संदर्भ में जारी नोटों से यह अस्पष्ट रेखा है? "DATAJPA-1104 - एपीआई के लिए रिपॉजिटरी इंटरफेस में बदलाव" आपको कैसे पता चला? :-)
क्रिश्चियन

2
निश्चित नहीं है कि यह कोई माइग्रेशन गाइड है, लेकिन आप इसे केआई रिलीज़ ट्रेन विकी ( github.com/spring-projects/spring-data-commons/wiki/… ) के साथ-साथ स्प्रिंग डेटा डॉन्स चैंजोग ( डॉक्स) में भी देख सकते हैं। .spring.io / वसंत-डाटा / कॉमन्स / docs / वर्तमान / changelog.txt )
सीन कैरोल

104

ध्यान दें कि इसके findByIdलिए एक सटीक प्रतिस्थापन नहीं है findOne, यह Optionalइसके बजाय वापस आता है null

नए जावा चीजों से बहुत परिचित नहीं होने के कारण मुझे इसका पता लगाने में थोड़ा समय लगा, लेकिन यह findByIdव्यवहार को findOneएक में बदल देता है :

return rep.findById(id).orElse(null);

1
सबसे अच्छा विचार नहीं है: आपका कोड काम करना जारी रखेगा लेकिन आप एपीआई का उपयोग नहीं कर रहे हैं जैसा कि आपको करना चाहिएOptionalसभी nullचेक से कोड को साफ करने के लिए जोड़ा गया था । बस आप वापसी के तरीके को बदल दें और एक अच्छे बॉय-स्काउट कीOptional तरह उपयोग करें
GabiM

5
@ गैबीएम यह बहुत अच्छा होगा यदि आपके पास सभी तरीकों का नियंत्रण है। यहां तक ​​कि अगर आपके पास सब कुछ डाउनस्ट्रीम का नियंत्रण है और आपकी परियोजना किसी अन्य थर्ड पार्टी प्रोजेक्ट के लिए निर्भरता नहीं है, यदि विधियां शून्य के लिए डाउनस्ट्रीम कोड (जैसे कि, मौजूद नहीं हैं, या गायब होने पर कुछ तर्क करें), तो आपके पास है उन्हें भी ठीक करने के लिए।
zeusemighty

@ गैबीएम से लिंक के संदर्भ में, मैं सिर्फ यह बताना चाहता था कि वह लिंक यह भी कहता है कि "यह ध्यान रखना महत्वपूर्ण है कि वैकल्पिक वर्ग का इरादा हर एक अशक्त संदर्भ को बदलना नहीं है"
स्कॉट कार्लसन

32

हमारे पास पुरानी findOne()पद्धति के कई सैकड़ों उपयोग थे । मैमथ रिफ्लेक्टर पर लगने के बजाय, हमने निम्नलिखित मध्यस्थ इंटरफ़ेस का निर्माण किया और हमारी रिपॉजिटरी ने इसे JpaRepositoryसीधे विस्तारित करने के बजाय आगे बढ़ाया

@NoRepositoryBean
public interface BaseJpaRepository<T, ID> extends JpaRepository<T, ID> { 
    default T findOne(ID id) { 
        return (T) findById(id).orElse(null); 
    } 
} 

मेरे लिए शीर्ष समाधान। कास्टिंग की जरूरत नहीं। return findById(id).orElse(null);पर्याप्त
Ken007

पूर्णतया सहमत। परिवर्तनों की सैकड़ों पंक्तियाँ मुझे बचा लीं।
स्कॉट कार्लसन

7

एक व्यावहारिक परिवर्तन

पुराना तरीका:

Entity aThing = repository.findOne(1L);

नया रास्ता:

Optional<Entity> aThing = repository.findById(1L);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.