Eksik CrudRepository # findOne yöntemi


101

Projemde Spring 5 kullanıyorum. Bugüne kadar mevcut yöntem vardı CrudRepository#findOne.

Ancak en son anlık görüntüyü indirdikten sonra aniden kayboldu! Yöntemin şu anda mevcut olmadığına dair herhangi bir referans var mı?

Bağımlılık listem:

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

GÜNCELLEME:

Görünüşe göre bu yöntem değiştirilmiş CrudRepository#findById

Yanıtlar:


153

Lütfen aşağıdaki yeniden adlandırmalara sahip bu kaydetmeyle ilişkili DATACMNS-944'e bakın

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

1
Kaçırdığım bir geçiş rehberi var mı, yoksa sürüm notlarındaki bu belirsiz satır, var olan duyurular açısından mı? "DATAJPA-1104 - Depo arayüzlerindeki API değişikliklerine uyum" Nasıl öğrendiniz? :-)
Christian

2
Bunun herhangi bir geçiş kılavuzu olup olmadığından emin değilim, ancak buna Kay sürüm treni wiki'sinde ( github.com/spring-projects/spring-data-commons/wiki/… ) ve Spring Data Commons değişiklik günlüğünde ( belgeler .spring.io / spring-data / commons / docs / current / changelog.txt )
Sean Carroll

104

Bunun findByIdtam olarak yerine geçmediğini unutmayın, yerine findOnebir döndürür .Optionalnull

Yeni java şeylerine pek aşina olmamak, anlamam biraz zaman aldı, ancak bu findByIddavranışı findOnetek bir davranışa dönüştürüyor :

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

1
En iyi fikir değil: Kodunuz çalışmaya devam edecek, ancak API'yi gerektiği gibi kullanmıyorsunuz . Optionalkodu tüm nullkontrollerden temizlemek için eklendi . Geri dönüş yönteminizi değiştirin ve iyi bir izciOptional gibi kullanın
GabiM

5
@GabiM Aşağı akıştaki tüm yöntemlerin kontrolüne sahipseniz bu harika olur. Aşağı akıştaki her şeyin kontrolüne sahip olsanız ve projeniz başka bir üçüncü taraf projesine bağımlı olmasa bile, aşağı akış yöntemleri null için kodluysa (olduğu gibi, yoksa oluşturun veya eksikse biraz mantık yapın), o zaman onları da düzeltmek için.
zeusalmighty

@GabiM'deki bağlantıya atıfta bulunarak, sadece bu bağlantının bile "İsteğe bağlı sınıfın amacının her boş referansın yerini almaması önemlidir" dediğini belirtmek istedim
Scott Carlson,

32

Eski findOne()yöntemin yüzlerce kullanımına sahiptik . Muazzam bir yeniden düzenleyiciye girişmek yerine, aşağıdaki ara arayüzü oluşturduk ve depolarımızın JpaRepositorydoğrudan genişletmek yerine onu genişletmesini sağladık.

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

Benim için en iyi çözüm. Döküm yapmaya gerek yok. return findById(id).orElse(null);yeterli
Ken007

Tamamen katılıyorum. Beni yüzlerce satır değişiklikten kurtardı.
Scott Carlson

7

Pragmatik bir dönüşüm

Eski yol:

Entity aThing = repository.findOne(1L);

Yeni yol:

Optional<Entity> aThing = repository.findById(1L);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.