我正在做一些專案,他們要求做一個全域過濾器,我的問題是有沒有機會做一個全域過濾器而不使用很多是否檢查用戶是否添加了該過濾器?這是我的一個專案的示例:在存盤庫中我添加了以下代碼:
@Query("from students s join Class_Room c on s.classRoom.id=c.id join teachers t on t.id=c.id "
"where c.name= :className AND t.subject= :subject AND s.name= :name")
List<Student> studentClassProf(@Param("className") String className, @Param("subject") String subject, @Param("name") String name);
@Query("from students s join Class_Room c on s.classRoom.id=c.id join teachers t on t.id=c.id "
"where c.name= :className AND t.subject= :subject")
List<Student> studentClassProf(@Param("className") String className, @Param("subject") String subject);
在我的控制器類中,我使用了這個:
@GetMapping("/globalSearch")
public ResponseEntity<String> globalSearch(String studentName, String teacherName, String className, String subject) throws MyNotFoundException {
if (studentName != null && teacherName != null && className != null && subject != null) {
studentRepo.studentClassProf(className, subject, studentName);
}
if (studentName == null && teacherName != null && className != null && subject != null) {
studentRepo.studentClassProf(className, subject);
}
....
那么,如果不添加大量 if 來檢查該欄位是否為空,或者我無法解決任何問題并且我總是必須撰寫很多 if 塊,我該怎么辦?
uj5u.com熱心網友回復:
你可以使用JpaSpecificationExecutor<T>.
為了使用它,您必須從以下位置擴展您的存盤庫介面JpaSpecificationExecutor<T>:
public interface StudentRepository extends JpaRepository<Student, UUID>,
JpaSpecificationExecutor<Student> {}
然后,您可以創建一個基于引數或過濾器類生成規范的方法。
public class StudentSpecification {
private static Specification<Student> getStudentFilterSpecification(String studentName, String teacherName, String className, String subject) {
return (root, query, criteriaBuilder) -> {
Predicate predicate = criteriaBuilder.conjunction();
// Condition student name.
if (Objects.nonNull(studentName)) {
predicate = criteriaBuilder.and(predicate, criteriaBuilder
.equal(root.get("studentName"), studentName));
}
// Condition teacher name.
if (Objects.nonNull(teacherName)) {
predicate = criteriaBuilder.and(predicate, criteriaBuilder
.equal(root.get("teacherName"), teacherName));
}
// Condition class name.
if (Objects.nonNull(className)) {
predicate = criteriaBuilder.and(predicate, criteriaBuilder
.equal(root.get("className"), className));
}
// Condition subject.
if (Objects.nonNull(subject)) {
predicate = criteriaBuilder.and(predicate, criteriaBuilder
.equal(root.get("subject"), subject));
}
return predicate;
};
}
}
現在您可以發送帶有規范的搜索請求。
@GetMapping("/globalSearch")
public ResponseEntity<String> globalSearch(
String studentName, String teacherName, String className, String subject)
throws MyNotFoundException {
studentRepo.findAll(StudentSpecification
.getStudentFilterSpecification(studentName,
teacherName, className, subject));
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/437302.html
