Oi Ricardo,
Na verdade não tem implementação mesmo. Você apenas declara a assinatura do método na interface, e o próprio Spring Data JPA que se encarrega de implementar dinamicamente esse método, baseado no nome dele.
É meio bruxaria mesmo :D
Na primeira vez que vi isso fiquei perguntando a mesma coisa: Ué só cria a interface? Mas cade a implementação? e como ele sabe qual implementação chamar???
Isso é gerado de maneira dinamica e automatizada pelo Spring.
O problema é que você precisa seguir a conveção dele ao nomear seu método. Exemplos:
List<Convidado> findByNomeLike(String nome);
List<Convidado> findByNomeAndEmail(String nome, String email);
List<Convidado> findByTelefoneNotNullOrderByNomeDesc();
Mas caso você precise de uma querie mais complexa, ou queira deixar o método com um nome mais simples e legivel, pode utilizar a anotação @Query
:
@Query("SELECT c FROM Convidado c JOIN FETCH ... WHERE c.nome = :nome ORDER BY ...")
List<Convidado> buscarPeloNome(@Param("nome") String nome);
Bons estudos!