Ответ 1
Итак, spring-data
выполняет некоторую дополнительную магию, которая помогает при сложных запросах. Сначала это странно, и вы полностью пропустите его в документах, но он действительно мощный и полезный.
Он включает создание пользовательского Repository
и пользовательского `RepositoryImpl 'и сообщения Spring, где его найти. Вот пример:
Конфигурационный класс - указывает на вашу все еще необходимую конфигурацию xml с аннотацией, указывающей на ваш пакет репозиториев (теперь он ищет классы *Impl
):
@Configuration
@EnableJpaRepositories(basePackages = {"com.examples.repositories"})
@EnableTransactionManagement
public class MyConfiguration {
}
jpa-repositories.xml - сообщить Spring
, где можно найти ваши репозитории. Также сообщите Spring
о поиске пользовательских репозиториев с именем файла CustomImpl
:
<?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
- здесь вы можете поместить аннотированные и неавтоматизированные методы запросов. Обратите внимание, что этот интерфейс репозитория расширяет 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
- методы репозитория, которые являются более сложными и не могут обрабатываться простым запросом или аннотацией:
public interface MyObjectRepositoryCustom {
List<MyObject> findByNameWithWeirdOrdering(String name);
}
MyObjectRepositoryCustomImpl
- где вы фактически реализуете эти методы с помощью autwired 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);
}
}
Удивительно, что все это объединяется, и методы из обоих интерфейсов (и интерфейс CRUD, которые вы реализуете) появляются, когда вы делаете:
myObjectRepository.
Вы увидите:
myObjectRepository.save()
myObjectRepository.findAll()
myObjectRepository.findByName()
myObjectRepository.findByFirstNameOrMiddleName()
myObjectRepository.findByNameWithWeirdOrdering()
Это действительно работает. И вы получаете один интерфейс для запросов. spring-data
действительно готов для большого приложения. И чем больше запросов вы можете сделать простым или аннотацией, тем лучше вы будете.
Все это задокументировано на Spring сайте Data Jpa.
Удачи.