क्या आपने विनिर्देशों ?
विनिर्देशों का उपयोग करके, आप गतिशील रूप से WHERE
. उत्पन्न कर सकते हैं स्प्रिंग डेटा क्वेरी का हिस्सा। अपने स्प्रिंग डेटा जेपीए प्रश्नों के साथ विनिर्देशों का उपयोग करने के लिए, आपको org.springframework.data.jpa.repository.JpaSpecificationExecutor
का विस्तार करना होगा। इंटरफेस। तो आपका उपयोगकर्ता भंडार इस तरह दिख सकता है:
public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
}
आपकी खोज विधि कुछ इस तरह दिख सकती है
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);
}
सबसे पहले हम name LIKE %text%
. जोड़कर शुरू करते हैं जहां अभिव्यक्ति का हिस्सा है।
इसके बाद, हम जांचते हैं कि क्या text
. का मान है वेरिएबल को long
. पर कास्ट किया जा सकता है . यदि यह हो सकता है, तो हम स्ट्रिंग से लंबा मान प्राप्त करते हैं और इसे जहां क्वेरी में जोड़ते हैं।
अंत में हम जाँचते हैं कि क्या text
चर को बूलियन में डाला जा सकता है। अगर ऐसा हो सकता है, तो हम उस चेक को क्वेरी में भी जोड़ देते हैं।
उदाहरण के लिए, यदि text
. का मान चर test1 है जहां हिस्सा होगा
WHERE name LIKE '%test1%;
अगर text
. का मान चर सत्य है तो वह भाग कहाँ होगा
WHERE name LIKE '%true%' OR is_active = true;
अंत में, यदि text
. का मान चर 12 है तो वह भाग कहाँ होगा
WHERE name LIKE '%12%' OR id = 12;
नोट: मैंने जोड़ा cb.lower(root.get("name"))
और text.toLowerCase()
जब हम खोज केस को असंवेदनशील बनाने के लिए नाम से खोजते हैं।