Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

जेपीए खोज स्ट्रिंग, लंबी और बूलियन

क्या आपने विनिर्देशों ?

विनिर्देशों का उपयोग करके, आप गतिशील रूप से 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() जब हम खोज केस को असंवेदनशील बनाने के लिए नाम से खोजते हैं।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. क्या मुझे इसे संग्रहीत करने के बाद MySQL परिणाम मुक्त करना है?

  2. मैं MySQL में प्रत्येक पंक्ति में कैसे जोड़ूं?

  3. ORDER BY के बाद GROUP BY

  4. केवल तभी चुनें जब भिन्न मान

  5. क्या तालिका में शामिल होने के लिए मेरी क्वेरी में कोई गलत कोड है?