Отсутствует метод CrudRepository # findOne

101

Я использую Spring 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

Андрей Абрамов
источник

Ответы:

153

См. 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 в интерфейсах репозитория» Как вы узнали? :-)
Christian
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, я просто хотел указать, что даже в этой ссылке говорится: «Важно отметить, что намерение класса Optional не заменять каждую отдельную пустую ссылку»
Скотт Карлсон,
32

У нас было много сотен применений старого findOne()метода. Вместо того, чтобы приступить к гигантскому рефакторингу, мы в итоге создали следующий промежуточный интерфейс, и наши репозитории расширили его, а не JpaRepositoryнапрямую.

@NoRepositoryBean
public interface BaseJpaRepository<T, ID> extends JpaRepository<T, ID> { 
    default T findOne(ID id) { 
        return (T) findById(id).orElse(null); 
    } 
} 
Ashario
источник
Лучшее решение для меня. Нет необходимости в кастинге. return findById(id).orElse(null);достаточно
Ken007
Полностью согласен. Сохранил мне сотни строк изменений.
Скотт Карлсон
7

Прагматическая трансформация

Старый способ:

Entity aThing = repository.findOne(1L);

Новый способ:

Optional<Entity> aThing = repository.findById(1L);
До Нху Ви
источник