Sudahkah Anda mempertimbangkan penggunaan Spesifikasi ?
Dengan menggunakan spesifikasi, Anda dapat secara dinamis menghasilkan WHERE
bagian dari kueri data pegas. Untuk menggunakan spesifikasi dengan kueri JPA data pegas, Anda harus memperluas org.springframework.data.jpa.repository.JpaSpecificationExecutor
antarmuka. Jadi repositori pengguna Anda akan terlihat seperti ini:
public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
}
Metode pencarian Anda bisa terlihat seperti ini
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);
}
Pertama kita mulai dengan menambahkan name LIKE %text%
bagian dari ekspresi where.
Selanjutnya, kita periksa apakah nilai dari text
variabel dapat dilemparkan ke long
. Jika bisa, maka kita mendapatkan nilai panjang dari string dan menambahkannya ke kueri where.
Terakhir kita periksa apakah text
variabel dapat dilemparkan ke boolean. Jika bisa, kami juga menambahkan tanda centang itu ke kueri.
Misalnya, jika nilai text
variabelnya adalah test1 bagian mananya
WHERE name LIKE '%test1%;
Jika nilai text
variabel benar lalu bagian mananya
WHERE name LIKE '%true%' OR is_active = true;
Terakhir, jika nilai text
variabelnya adalah 12 lalu bagian mananya
WHERE name LIKE '%12%' OR id = 12;
Catatan: Saya menambahkan cb.lower(root.get("name"))
dan text.toLowerCase()
ke bagian ketika kami mencari berdasarkan nama untuk membuat kasus pencarian tidak sensitif.