Vì vậy, spring-data
có một số phép thuật bổ sung giúp với các truy vấn phức tạp. Nó là lạ lúc đầu và bạn hoàn toàn bỏ qua nó trong các tài liệu nhưng nó thực sự mạnh mẽ và hữu ích.
Nó liên quan đến việc tạo một tùy chỉnh Repository
và một 'Kho lưu trữ' tùy chỉnh và nói với Spring nơi tìm thấy nó. Đây là một ví dụ:
Lớp cấu hình - trỏ đến cấu hình xml vẫn cần thiết của bạn với chú thích trỏ đến gói kho của bạn (hiện tại nó sẽ tìm *Impl
các lớp tự động):
@Configuration
@EnableJpaRepositories(basePackages = {"com.examples.repositories"})
@EnableTransactionManagement
public class MyConfiguration {
}
jpa-repositories.xml - cho biết Spring
nơi tìm kho lưu trữ của bạn. Cũng nói Spring
để tìm các kho lưu trữ tùy chỉnh với CustomImpl
tên tệp:
<?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
- đây là nơi bạn có thể đặt các phương thức truy vấn có chú thích và không được quản lý. Lưu ý cách giao diện kho lưu trữ này mở rộng giao diện 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
- các phương thức lưu trữ phức tạp hơn và không thể được xử lý bằng một truy vấn đơn giản hoặc chú thích:
public interface MyObjectRepositoryCustom {
List<MyObject> findByNameWithWeirdOrdering(String name);
}
MyObjectRepositoryCustomImpl
- nơi bạn thực sự thực hiện các phương thức đó với quyền tự động 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);
}
}
Thật ngạc nhiên, tất cả đều đi kèm với nhau và các phương thức từ cả hai giao diện (và giao diện CRUD, bạn triển khai) đều hiển thị khi bạn thực hiện:
myObjectRepository.
Bạn sẽ thấy:
myObjectRepository.save()
myObjectRepository.findAll()
myObjectRepository.findByName()
myObjectRepository.findByFirstNameOrMiddleName()
myObjectRepository.findByNameWithWeirdOrdering()
Nó thực sự làm việc. Và bạn nhận được một giao diện để truy vấn. spring-data
thực sự đã sẵn sàng cho một ứng dụng lớn. Và càng nhiều truy vấn bạn có thể đẩy vào đơn giản hoặc chú thích thì càng tốt cho bạn.
Tất cả những điều này được ghi lại tại trang web Spring Data Jpa .
Chúc may mắn.