Відсутній метод 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 - Адаптувати зміни API в інтерфейсах сховища" Як ви дізналися? :-)
Крістіан

2
Не впевнений, що це будь-який посібник з міграції, але ви можете знайти посилання на нього у вікі випуску Kay ( github.com/spring-projects/spring-data-commons/wiki/… ), а також у змінному журналі змін даних Spring Data Commons ( документи .spring.io / spring-data / commons / docs / current / changelog.txt )
Шон Керролл

104

Зауважте, що findByIdце не є точною заміною findOne, вона повертає Optionalзамість null.

Будучи не дуже знайомим з новими речами Java, мені знадобилося трохи часу, аби зрозуміти, але це перетворює findByIdповедінку на findOneодну:

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

1
Не найкраща ідея: ваш код продовжить працювати, але ви не використовуєте API як слід . Optionalдодано для очищення коду від усіх nullперевірок. Просто змініть тип повернення свого методу і використовуйте Optionalяк хороший хлопчик-розвідник
GabiM

5
@GabiM Це було б чудово, якщо ви маєте контроль над усіма методами нижче. Навіть якщо у вас є контроль над усім за течією, і ваш проект не є залежністю для якогось іншого стороннього проекту, якщо методи низхідного коду для null (як у, створити, якщо його немає, або виконувати певну логіку, якщо він відсутній), то у вас є виправити їх також.
zeusalmighty

Посилаючись на посилання від @GabiM, я просто хотів зазначити, що навіть на цьому посиланні сказано "Важливо зазначити, що намір класу" Факультативний "- не замінювати кожну нульову посилання"
Скотт Карлсон

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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.