Jadi, spring-data
lakukan beberapa sihir tambahan yang membantu dengan pertanyaan kompleks. Ini aneh pada awalnya dan Anda benar-benar melewatkannya di dokumen tetapi sangat kuat dan berguna.
Ini melibatkan pembuatan custom Repository
dan `RepositoryImpl 'kustom dan memberitahu Spring di mana menemukannya. Berikut ini sebuah contoh:
Kelas konfigurasi - arahkan ke konfigurasi xml Anda yang masih dibutuhkan dengan anotasi yang menunjuk ke paket repositori Anda (sekarang mencari *Impl
kelas secara otomatis):
@Configuration
@EnableJpaRepositories(basePackages = {"com.examples.repositories"})
@EnableTransactionManagement
public class MyConfiguration {
}
jpa-repositories.xml - beri tahu di Spring
mana menemukan repositori Anda. Katakan juga Spring
untuk mencari repositori khusus dengan CustomImpl
nama 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
- ini adalah tempat Anda dapat memasukkan metode kueri beranotasi dan tidak berotot. Perhatikan bagaimana antarmuka repositori ini memperluasnya 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
- metode repositori yang lebih kompleks dan tidak dapat ditangani dengan permintaan sederhana atau anotasi:
public interface MyObjectRepositoryCustom {
List<MyObject> findByNameWithWeirdOrdering(String name);
}
MyObjectRepositoryCustomImpl
- di mana Anda benar-benar menerapkan metode-metode itu dengan 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);
}
}
Hebatnya, ini semua datang bersama-sama dan metode dari kedua antarmuka (dan antarmuka CRUD, Anda menerapkan) semua muncul ketika Anda melakukannya:
myObjectRepository.
Kamu akan lihat:
myObjectRepository.save()
myObjectRepository.findAll()
myObjectRepository.findByName()
myObjectRepository.findByFirstNameOrMiddleName()
myObjectRepository.findByNameWithWeirdOrdering()
Ini benar-benar bekerja. Dan Anda mendapatkan satu antarmuka untuk query. spring-data
benar-benar siap untuk aplikasi besar. Dan semakin banyak pertanyaan yang bisa Anda buat menjadi sederhana atau anotasi, semakin baik Anda.
Semua ini didokumentasikan di situs Spring Data Jpa .
Semoga berhasil.