Quindi, spring-data
fa qualche magia in più che aiuta con query complesse. All'inizio è strano e lo salti completamente nei documenti, ma è davvero potente e utile.
Implica la creazione di un Repository
`RepositoryImpl ' personalizzato e personalizzato e di dire a Spring dove trovarlo. Ecco un esempio:
Classe di configurazione: punta alla tua configurazione xml ancora necessaria con l'annotazione che punta al pacchetto di repository (cerca *Impl
automaticamente le classi ora):
@Configuration
@EnableJpaRepositories(basePackages = {"com.examples.repositories"})
@EnableTransactionManagement
public class MyConfiguration {
}
jpa-repositories.xml - indica Spring
dove trovare i propri repository. Indica anche Spring
di cercare repository personalizzati con il CustomImpl
nome del file:
<?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
- qui è possibile inserire metodi di query annotati e non annotati. Nota come questa interfaccia di repository estende Custom
quella:
@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
- metodi di repository più complessi e che non possono essere gestiti con una query semplice o un'annotazione:
public interface MyObjectRepositoryCustom {
List<MyObject> findByNameWithWeirdOrdering(String name);
}
MyObjectRepositoryCustomImpl
- dove si implementano effettivamente questi metodi con un autowired 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);
}
}
Sorprendentemente, tutto questo si unisce e i metodi di entrambe le interfacce (e dell'interfaccia CRUD, implementata) vengono visualizzati tutti quando si esegue:
myObjectRepository.
Vedrai:
myObjectRepository.save()
myObjectRepository.findAll()
myObjectRepository.findByName()
myObjectRepository.findByFirstNameOrMiddleName()
myObjectRepository.findByNameWithWeirdOrdering()
Funziona davvero. E ottieni un'interfaccia per le query. spring-data
è davvero pronto per una grande applicazione. E più query puoi inserire in semplici o annotazioni, tanto meglio sei.
Tutto questo è documentato sul sito Spring Data Jpa .
In bocca al lupo.