Metode CrudRepository # findOne tidak ada

101

Saya menggunakan Spring 5 dalam proyek saya. Sampai saat ini masih ada metode yang tersedia CrudRepository#findOne.

Tetapi setelah mengunduh snapshot terbaru, tiba-tiba menghilang! Apakah ada referensi bahwa metode tersebut tidak tersedia sekarang?

Daftar ketergantungan saya:

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'
}

MEMPERBARUI:

Tampaknya metode ini telah diganti dengan CrudRepository#findById

Andrii Abramov
sumber

Jawaban:

150

Silakan lihat DATACMNS-944 yang terkait dengan komit ini yang memiliki penggantian nama berikut

╔═════════════════════╦═══════════════════════╗
║      Old name       ║       New name        ║
╠═════════════════════╬═══════════════════════╣
║ findOne(…)          ║ findById(…)           ║
╠═════════════════════╬═══════════════════════╣
║ save(Iterable)      ║ saveAll(Iterable)     ║
╠═════════════════════╬═══════════════════════╣
║ findAll(Iterable)   ║ findAllById(…)        ║
╠═════════════════════╬═══════════════════════╣
║ delete(ID)          ║ deleteById(ID)        ║
╠═════════════════════╬═══════════════════════╣
║ delete(Iterable)    ║ deleteAll(Iterable)   ║
╠═════════════════════╬═══════════════════════╣
║ exists()            ║ existsById(…)         ║
╚═════════════════════╩═══════════════════════╝
Sean Carroll
sumber
1
Apakah ada panduan migrasi yang saya lewatkan, atau apakah baris samar dari catatan rilis ini semuanya ada dalam hal pengumuman? "DATAJPA-1104 - Beradaptasi dengan perubahan API di antarmuka repositori" Bagaimana Anda mengetahuinya? :-)
Christian
2
Tidak yakin apakah ini adalah panduan migrasi tetapi Anda dapat menemukan rujukannya di wiki kereta rilis Kay ( github.com/spring-projects/spring-data-commons/wiki/… ) serta log perubahan Spring Data Commons ( docs .spring.io / spring-data / commons / docs / current / changelog.txt )
Sean Carroll
104

Perhatikan bahwa findByIdini bukan pengganti yang tepat findOne, ia mengembalikan Optionalalih - alih null.

Menjadi tidak terlalu akrab dengan hal-hal baru java butuh beberapa saat untuk mengetahuinya, tetapi ini mengubah findByIdperilakunya menjadi findOnesatu:

return rep.findById(id).orElse(null);
Tinus Tate
sumber
1
Bukan ide terbaik: kode Anda akan terus berfungsi tetapi Anda tidak menggunakan API sebagaimana mestinya . Optionalditambahkan untuk membersihkan kode dari semua nullpemeriksaan. Ubah saja metode jenis pengembalian Anda dan gunakan Optionalseperti pramuka yang baik
GabiM
5
@GabiM Ini akan bagus jika Anda memiliki kendali atas semua metode hilir. Meskipun Anda memiliki kendali atas semua yang ada di hilir dan proyek Anda bukan ketergantungan untuk beberapa proyek pihak ketiga lainnya, jika metode kode hilir untuk null (seperti dalam, buat jika tidak ada, atau lakukan beberapa logika jika hilang), maka Anda memiliki untuk memperbaikinya juga.
zeusalmighty
Mengacu pada tautan dari @GabiM, saya hanya ingin menunjukkan bahwa bahkan tautan tersebut mengatakan "Penting untuk dicatat bahwa tujuan kelas Opsional bukanlah untuk mengganti setiap referensi nol"
Scott Carlson
32

Kami memiliki ratusan penggunaan findOne()metode lama . Daripada memulai refactor raksasa, kami akhirnya membuat antarmuka perantara berikut dan repositori kami memperluasnya alih-alih memperluas JpaRepositorysecara langsung

@NoRepositoryBean
public interface BaseJpaRepository<T, ID> extends JpaRepository<T, ID> { 
    default T findOne(ID id) { 
        return (T) findById(id).orElse(null); 
    } 
} 
ashario
sumber
Solusi teratas untuk saya. Tidak perlu melakukan transmisi. return findById(id).orElse(null);cukup
Ken007
Setuju. Menyelamatkan saya ratusan baris perubahan.
Scott Carlson
7

Transformasi pragmatis

Cara lama:

Entity aThing = repository.findOne(1L);

Jalan baru:

Optional<Entity> aThing = repository.findById(1L);
Do Nhu Vy
sumber