ক্রুডেপোসিটোরি # হারিয়ে যাওয়া একটি পদ্ধতি ne


102

আমি আমার প্রকল্পে স্প্রিং 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

উত্তর:


155

দয়া করে 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(…)         ║
╚═════════════════════╩═══════════════════════╝

4
আমি যে কোনও মাইগ্রেশন গাইড মিস করেছি, নাকি প্রকাশের নোটগুলির মধ্যে এই অস্পষ্ট লাইনটি ছিল সমস্ত ঘোষণার ক্ষেত্রে? "ডেটাজেপিএ-1104 - সংগ্রহস্থল ইন্টারফেসগুলিতে এপিআই পরিবর্তনগুলিতে অভিযোজিত" আপনি কীভাবে এটি আবিষ্কার করলেন? :-)
খ্রিস্টান

4
নিশ্চিত হতে পারছি না এই কোন মাইগ্রেশন পথপ্রদর্শক হয় কিন্তু আপনি কে মুক্তি ট্রেন উইকি (এটা রেফারেন্স জানতে পারেন github.com/spring-projects/spring-data-commons/wiki/... সেইসাথে স্প্রিং ডাটা কমন্স পরিবর্তণের () ডক্স .spring.io / বসন্ত-ডেটা / কমন্স / ডক্স / বর্তমান / চেঞ্জলগ.txt )
সান ক্যারল

105

মনে রাখবেন যে এটির findByIdজন্য সঠিক প্রতিস্থাপন নয় findOne, এর Optionalপরিবর্তে এটি প্রদান করে null

নতুন জাভা জিনিসগুলির সাথে খুব বেশি পরিচিত না হওয়ায় এটি বের করতে আমার কিছুটা সময় লেগেছে, তবে এটি findByIdআচরণটি findOneএকটিকে রূপান্তরিত করে :

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

4
সেরা ধারণা নয়: আপনার কোডটি কাজ চালিয়ে যাবে তবে আপনি APIটি যেমনটি ব্যবহার করেন তেমন ব্যবহার করছেন না । Optionalসমস্ত nullচেক থেকে কোড পরিষ্কার করার জন্য যুক্ত করা হয়েছিল । আপনার রিটার্নের ধরনটি কেবল পরিবর্তিত করুন এবং ভাল বয়-স্কাউটেরOptional মতো ব্যবহার করুন
GabiM

5
@ গ্যাবিএম আপনার পক্ষে যদি সর্বোপরি সমস্ত পদ্ধতির নিয়ন্ত্রণ থাকে তবে এটি দুর্দান্ত হবে। এমনকি যদি আপনার স্ট্রিম স্ট্রিমের সমস্ত কিছুর নিয়ন্ত্রণ থাকে এবং আপনার প্রকল্পটি অন্য কোনও তৃতীয় পক্ষের প্রকল্পের জন্য নির্ভরতা না হয়, যদি নালগুলির জন্য ডাউনস্ট্রিম কোডগুলি (যদি উপস্থিত থাকে তবে উপস্থিত না থাকলে তৈরি করুন বা অনুপস্থিত থাকলে কিছু যুক্তি দিয়ে থাকেন) তবে আপনার কাছে তাদের ঠিক করতে।
জিউসেলামিটি

@ গ্যাবিএম-এর লিঙ্কটি প্রসঙ্গে, আমি কেবল উল্লেখ করতে চেয়েছিলাম যে এমনকি সেই লিঙ্কটিও বলেছে যে "noteচ্ছিক শ্রেণীর উদ্দেশ্যটি প্রতিটি নাল রেফারেন্সকে প্রতিস্থাপন করা নয়"
স্কট কার্লসন

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);

0

আরও একটি উপায়। একটি @ ক্যোয়ারী যুক্ত করুন। এমনকি যদি আমি consumeচ্ছিক গ্রহণ করতে পছন্দ করি তবে:

@Repository
public interface AccountRepository extends JpaRepository<AccountEntity, Long> {

    @Query("select a from AccountEntity a where a.id=?1")
    public AccountEntity findOne(Long id);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.