Entonces, spring-data
hace un poco de magia extra que ayuda con consultas complejas. Al principio es extraño y lo omites por completo en los documentos, pero es realmente poderoso y útil.
Implica crear una costumbre Repository
'RepositoryImpl' y personalizado y decirle a Spring dónde encontrarlo. Aquí hay un ejemplo:
Clase de configuración: señale su configuración xml aún necesaria con una anotación que apunte a su paquete de repositorios (ahora busca *Impl
clases automáticamente):
@Configuration
@EnableJpaRepositories(basePackages = {"com.examples.repositories"})
@EnableTransactionManagement
public class MyConfiguration {
}
jpa-repositories.xml: indica Spring
dónde encontrar tus repositorios. También indique Spring
que busque repositorios personalizados con el CustomImpl
nombre del archivo:
<?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
- Aquí es donde puede colocar métodos de consulta anotados y no anotados. Tenga en cuenta cómo esta interfaz de repositorio extiende el Custom
uno:
@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 repositorio que son más complejos y no se pueden manejar con una simple consulta o anotación:
public interface MyObjectRepositoryCustom {
List<MyObject> findByNameWithWeirdOrdering(String name);
}
MyObjectRepositoryCustomImpl
- donde realmente implementa esos métodos con un autoconectado 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, todo esto se combina y los métodos de ambas interfaces (y la interfaz CRUD que implementa) se muestran cuando lo hace:
myObjectRepository.
Ya verás:
myObjectRepository.save()
myObjectRepository.findAll()
myObjectRepository.findByName()
myObjectRepository.findByFirstNameOrMiddleName()
myObjectRepository.findByNameWithWeirdOrdering()
Realmente funciona. Y obtienes una interfaz para realizar consultas.spring-data
Realmente está listo para una gran aplicación. Y cuantas más consultas pueda enviar a simples o anotaciones, mejor será.
Todo esto está documentado en el sitio Spring Data Jpa .
Buena suerte.