Bạn đã xem xét việc sử dụng Thông số kỹ thuật ?
Sử dụng thông số kỹ thuật, bạn có thể tạo động WHERE
một phần của truy vấn dữ liệu mùa xuân. Để sử dụng thông số kỹ thuật với các truy vấn JPA dữ liệu mùa xuân, bạn sẽ phải mở rộng org.springframework.data.jpa.repository.JpaSpecificationExecutor
giao diện. Vì vậy, kho lưu trữ người dùng của bạn có thể trông giống như sau:
public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
}
Phương pháp tìm kiếm của bạn có thể trông giống như thế này
public List<User> getAllFilterByString(String text) {
if(StringUtils.isEmpty(text))
return userRepository.findAll();
Specification<User> specification =
(root, query, cb) -> {
List<Predicate> predicates = new ArrayList<>();
predicates.add(cb.like(cb.lower(root.get("name")), "%"+text.toLowerCase()+"%"));
//check if the text value can be casted to long.
//if it is possible, then add the check to the query
try {
long longValue = Long.valueOf(text);
predicates.add(cb.equal(root.get("id"), longValue));
}
catch (NumberFormatException e) {
//do nothing, the text is not long
}
//check if the text can be casted to boolean
//if it is possible, then add the check to the query
Boolean value = "true".equalsIgnoreCase(text) ? Boolean.TRUE :
"false".equalsIgnoreCase(text) ? Boolean.FALSE : null;
if(value != null) {
predicates.add(cb.equal(root.get("isActive"), value));
}
return cb.or(predicates.toArray(new Predicate[] {}));
};
return userRepository.findAll(specification);
}
Đầu tiên, chúng ta bắt đầu bằng cách thêm name LIKE %text%
một phần của biểu thức where.
Tiếp theo, chúng tôi kiểm tra xem giá trị của text
biến có thể được chuyển thành long
. Nếu có thể, thì chúng tôi lấy giá trị dài ra khỏi chuỗi và thêm nó vào truy vấn where.
Cuối cùng, chúng tôi kiểm tra xem text
biến có thể được chuyển thành boolean. Nếu có thể, thì chúng tôi cũng thêm séc đó vào truy vấn.
Ví dụ:nếu giá trị của text
biến là test1 phần sẽ ở đâu
WHERE name LIKE '%test1%;
Nếu giá trị của text
biến là true thì phần sẽ ở đâu
WHERE name LIKE '%true%' OR is_active = true;
Cuối cùng, nếu giá trị của text
biến là 12 thì phần sẽ ở đâu
WHERE name LIKE '%12%' OR id = 12;
Lưu ý: Tôi đã thêm cb.lower(root.get("name"))
và text.toLowerCase()
phần khi chúng tôi tìm kiếm theo tên để làm cho cụm từ tìm kiếm không phân biệt chữ hoa chữ thường.