Método CrudRepository # findOne ausente

101

Estou usando o Spring 5 em meu projeto. Até hoje não havia método disponível CrudRepository#findOne.

Mas depois de baixar o último instantâneo, ele desapareceu de repente! Existe alguma referência de que o método não está disponível agora?

Minha lista de dependências:

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

ATUALIZAR:

Parece que este método foi substituído por CrudRepository#findById

Andrii Abramov
fonte

Respostas:

150

Por favor, veja DATACMNS-944 que está associado a este commit que tem as seguintes renomeações

╔═════════════════════╦═══════════════════════╗
║      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
fonte
1
Perdi um guia de migração ou essa linha vaga das notas de lançamento era toda em termos de anúncios? "DATAJPA-1104 - Adapte-se às mudanças de API nas interfaces do repositório" Como você descobriu? :-)
Christian
2
Não tenho certeza se este é algum guia de migração, mas você pode encontrar referências a ele no wiki do trem de lançamento do Kay ( github.com/spring-projects/spring-data-commons/wiki/… ), bem como no changelog Spring Data Commons ( docs .spring.io / spring-data / commons / docs / current / changelog.txt )
Sean Carroll
103

Observe que findByIdnão é uma substituição exata para findOne, ele retorna um em Optionalvez de null.

Por não estar muito familiarizado com as novidades do java, demorei um pouco para descobrir, mas isso transforma o findByIdcomportamento em findOneum:

return rep.findById(id).orElse(null);
Tinus Tate
fonte
1
Não é a melhor ideia: seu código continuará funcionando, mas você não está usando a API como deveria . Optionalfoi adicionado para limpar o código de todas as nullverificações. Basta alterar o tipo de retorno do seu método e usar Optionalcomo um bom escoteiro deveria
GabiM
5
@GabiM Isso seria ótimo se você tivesse controle de todos os métodos downstream. Mesmo que você tenha o controle de tudo no downstream e seu projeto não seja uma dependência de algum outro projeto de terceiros, se os métodos downstream codificam para null (como em, criar se não existir ou fazer alguma lógica se estiver ausente), então você tem para corrigi-los também.
zeusalmighty
Em referência ao link de @GabiM, gostaria apenas de salientar que mesmo esse link diz "É importante observar que a intenção da classe Opcional não é substituir todas as referências nulas"
Scott Carlson
32

Tínhamos muitas centenas de usos do findOne()método antigo . Em vez de embarcar em um refator gigantesco, acabamos criando a seguinte interface intermediária e fizemos com que nossos repositórios a estendessem em vez de estender JpaRepositorydiretamente

@NoRepositoryBean
public interface BaseJpaRepository<T, ID> extends JpaRepository<T, ID> { 
    default T findOne(ID id) { 
        return (T) findById(id).orElse(null); 
    } 
} 
Ashario
fonte
A melhor solução para mim. Não há necessidade de fundição. return findById(id).orElse(null);basta
Ken007
Concordo plenamente. Me salvou centenas de linhas de mudanças.
Scott Carlson
7

Uma transformação pragmática

À moda antiga:

Entity aThing = repository.findOne(1L);

Nova forma:

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