Então, spring-data
faz alguma mágica extra que ajuda com consultas complexas. É estranho no começo e você pula totalmente nos documentos, mas é realmente poderoso e útil.
Envolve criar um personalizado Repository
e um personalizado `RepositoryImpl 'e dizer ao Spring onde encontrá-lo. Aqui está um exemplo:
Classe de configuração - aponte para sua configuração xml ainda necessária com a anotação apontando para o pacote de repositórios (ele procura *Impl
classes automaticamente agora):
@Configuration
@EnableJpaRepositories(basePackages = {"com.examples.repositories"})
@EnableTransactionManagement
public class MyConfiguration {
}
jpa-repositories.xml - diga Spring
onde encontrar seus repositórios. Diga também Spring
para procurar repositórios personalizados com o CustomImpl
nome do arquivo:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
<jpa:repositories base-package="com.example.repositories" repository-impl-postfix="CustomImpl" />
</beans>
MyObjectRepository
- é aqui que você pode colocar métodos de consulta anotados e não anotados. Observe como essa interface do repositório estende a seguinte Custom
:
@Transactional
public interface MyObjectRepository extends JpaRepository<MyObject, Integer>, MyObjectRepositoryCustom {
List<MyObject> findByName(String name);
@Query("select * from my_object where name = ?0 or middle_name = ?0")
List<MyObject> findByFirstNameOrMiddleName(String name);
}
MyObjectRepositoryCustom
- métodos de repositório que são mais complexos e não podem ser manipulados com uma consulta simples ou uma anotação:
public interface MyObjectRepositoryCustom {
List<MyObject> findByNameWithWeirdOrdering(String name);
}
MyObjectRepositoryCustomImpl
- onde você realmente implementa esses métodos com uma conexão automática EntityManager
:
public class MyObjectRepositoryCustomImpl implements MyObjectRepositoryCustom {
@Autowired
private EntityManager entityManager;
public final List<MyObject> findByNameWithWeirdOrdering(String name) {
Query query = query(where("name").is(name));
query.sort().on("whatever", Order.ASC);
return entityManager.find(query, MyObject.class);
}
}
Surpreendentemente, tudo isso se junta e os métodos de ambas as interfaces (e a interface CRUD que você implementa) aparecem quando você faz:
myObjectRepository.
Você verá:
myObjectRepository.save()
myObjectRepository.findAll()
myObjectRepository.findByName()
myObjectRepository.findByFirstNameOrMiddleName()
myObjectRepository.findByNameWithWeirdOrdering()
Realmente funciona. E você obtém uma interface para consulta. spring-data
está realmente pronto para uma aplicação grande. E quanto mais consultas você puder inserir em anotações simples ou apenas o melhor para você.
Tudo isso está documentado no site Spring Data Jpa .
Boa sorte.