Więc, spring-data
robi dodatkową magię, która pomaga w złożonych zapytaniach. Na początku jest to dziwne i całkowicie pominąć to w dokumentach, ale jest naprawdę potężny i użyteczny.
Obejmuje tworzenie niestandardowego Repository
i niestandardowego `RepositoryImpl 'oraz informowanie Spring, gdzie ją znaleźć. Oto przykład:
klasa
Konfiguracja - punkt do wciąż potrzebne xml config z adnotacja, wskazujący na opakowaniu repozytoriów (automatycznie wyszukuje *Impl
klas teraz):
@Configuration
@EnableJpaRepositories(basePackages = {"com.examples.repositories"})
@EnableTransactionManagement
public class MyConfiguration {
}
JPA-repozytoria .xml - powiedz Spring
gdzie znaleźć swoje repozytoria. Również powiedzieć Spring
szukać niestandardowych repozytorium o nazwie CustomImpl
pliku:
<?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
- jest to miejsce gdzie można umieścić adnotacje i nieopisanych metody zapytań.Zwróćmy uwagę, że interfejs repozytorium rozszerza Custom
pierwszy:
@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
- metody repozytorium, które są bardziej skomplikowane i może być obsługiwane w prosty zapytania lub adnotacją:
public interface MyObjectRepositoryCustom {
List<MyObject> findByNameWithWeirdOrdering(String name);
}
MyObjectRepositoryCustomImpl
- w przypadku rzeczywistego wdrożenia tych metod za pomocą autowyredu 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);
}
}
dziwo, to wszystko sprowadza się razem i metody z obu interfejsów (i interfejsu CRUD, wdrożyć) wszystko pokazać się, gdy robisz:
myObjectRepository.
Zobaczysz:
myObjectRepository.save()
myObjectRepository.findAll()
myObjectRepository.findByName()
myObjectRepository.findByFirstNameOrMiddleName()
myObjectRepository.findByNameWithWeirdOrdering()
To naprawdę działa. I masz jeden interfejs do wysyłania zapytań. spring-data
jest naprawdę gotowy na dużą aplikację. A im więcej pytań możesz wepchnąć w prostą lub adnotację, tym lepiej.
Wszystko to jest udokumentowane pod numerem Spring Data Jpa site.
Powodzenia.
O ile mi wiadomo, nie ma to większego znaczenia. Idź z tym, z którym jesteś bardziej komfortowy. Dlaczego debata? – duffymo
Jestem oczywiście o wiele bardziej komfortowy w Hibernate, ale jeśli mogę zrobić to samo i być bardziej produktywnym, wolałbym przyjąć nowsze podejścia. Jednakże, jeśli Hibernate jest jeszcze potężniejszy i napotkam o wiele mniej problemów, to jest coś, o czym chciałbym wiedzieć. – egervari
JPA to uogólnienie ORM, które wykorzystuje Hibernate jako jedną z wielu implementacji. Jakie moce przypisujesz sobie nawzajem? JPA jest standardem, ale widzę niewielką różnicę między tymi dwoma. W interesie pełnego ujawnienia, powiem, że nie dbam o żadną z nich. Oba generują SQL dla ciebie. Wolałbym to napisać sam. ORM nie jest dla każdego problemu i każdego użytkownika. – duffymo