2010-03-12 12 views
5

उदाहरण के लिए यदि मैं कुछ ऐसा करता हूं:आप मानदंड से मानदंड कैसे हटा सकते हैं?

Criteria c = session.createCriteria(Book.class) 
      .add(Expression.ge("release",reDate); 
      .add(Expression.ge("price",price); 
      .addOrder(Order.asc("date")) 
      .setFirstResult(0) 
      .setMaxResults(10); 
c.list(); 

मैं समान मानदंड उदाहरण का उपयोग कैसे कर सकता हूं, लेकिन दूसरे मानदंड को हटाएं (उदाहरण के लिए)? मैं एक गतिशील क्वेरी बनाने की कोशिश कर रहा हूं जिसमें मैं उपयोगकर्ता को फ़िल्टर को हटाने की अनुमति देना चाहता हूं, बैकएंड के बिना स्क्रैच से मानदंडों का पुनर्निर्माण करना।

धन्यवाद

उत्तर

6

जहाँ तक मुझे पता है, वहाँ एक बार आप इसे बनाने के लिए, मापदंड क्वेरी से बातें (प्रतिबंध, आदेश, आदि) को हटाने के लिए कोई रास्ता नहीं है। मैं मानदंड एपीआई के आंतरिक के बारे में पर्याप्त जानकारी नहीं जानता, लेकिन मुझे पता है कि खुला इंटरफ़ेस में कुछ भी नहीं है। आप add या addOrder में उन ऑब्जेक्ट्स में हेरफेर करने का प्रयास कर सकते हैं, लेकिन यह अधिक काम की तरह लगता है, खासकर जब क्लीनर विकल्प होते हैं।

मानदंड प्रश्न निश्चित रूप से मैंने देखा है कि हर आवेदन में एक शॉट का उपयोग किया गया है।

अब, आप क्या कर सकते हैं कस्टम प्रारूप में अपने प्रतिबंध, ऑर्डरिंग और सीमाएं संग्रहीत कर सकते हैं (उदा।, Collection), और फिर उस संग्रहित प्रारूप से अपनी क्वेरी को आसानी से बनाएं। यह संभवतः आपके उपयोगकर्ता इंटरफ़ेस को और अधिक समझ देगा क्योंकि आपको निश्चित रूप से वहां से बढ़िया नियंत्रण की आवश्यकता है।

वह उत्तर नहीं जिसे आप ढूंढ रहे हैं, मुझे यकीन है, लेकिन यह वही है जो मैंने अतीत में किया है।

HTH

1

कैसे मैं एक ही मापदंड उदाहरण उपयोग करें, लेकिन (उदाहरण के लिए) को हटाने के दूसरे कसौटी कर सकते हैं? मैं एक गतिशील क्वेरी बनाने की कोशिश कर रहा हूं जिसमें मैं उपयोगकर्ता को फ़िल्टर को हटाने की अनुमति देना चाहता हूं, बैकएंड के बिना स्क्रैच से मानदंडों का पुनर्निर्माण करना।

आप नहीं कर सकते हैं, आपको गतिशील क्वेरी बनाने के लिए उपयोग किए गए पैरामीटर के पूरे (अपडेटेड) सेट को फिर से भेजना होगा।

0

आप इस तरह से criterions निकाल सकते हैं:

public static void List<CriterionType> removeCriterions(Criteria criteria, Class<? extends Criterion> type) { 
    Iterator<CriterionEntry> criterionIterator = ((CriteriaImpl) criteria).iterateExpressionEntries(); 
    while (criterionIterator.hasNext()) { 
     CriterionEntry criterionEntry = criterionIterator.next(); 
     if (criterionEntry.getCriteria() == criteria) { 
      Criterion criterion = criterionEntry.getCriterion(); 
      if (null == type || criterion.getClass() == type) { 
       criterionIterator.remove(); 
      } 
     } 
    } 
} 
संबंधित मुद्दे