हाइबरनेट के साथ मापदंड क्वेरी का उपयोग करते समय आप एक साथ "या" मापदंड कैसे करते हैं?


79

मैं हाइबरनेट मापदंड क्वेरी का उपयोग करके तीन क्षेत्रों पर एक मूल "OR" करने की कोशिश कर रहा हूं।

उदाहरण

class Whatever{
 string name;
 string address;
 string phoneNumber;
}

मैं एक मापदंड क्वेरी बनाना चाहता हूँ जहाँ मेरी खोज स्ट्रिंग "नाम" या "पता" या "फोननंबर" से मेल खा सके।

जवाबों:


133

आप उपयोग करना चाहते हैं Restrictions.disjuntion()। इस तरह

session.createCriteria(Whatever.class)
    .add(Restrictions.disjunction()
        .add(Restrictions.eq("name", queryString))
        .add(Restrictions.eq("address", queryString))
        .add(Restrictions.eq("phoneNumber", queryString))
    );

यहां हाइबरनेट डॉक्टर देखें ।


यह एकदम सही है धन्यवाद! मुझे अंत में एक उदाहरण ऑनलाइन मिला, लेकिन मुझे खुशी है कि यह भविष्य के संदर्भ के लिए यहां है।
ScArcher2

8
अगर मैं चाहता तो क्या होता (name = x AND address = y) OR (phoneNumber = z)?
केविन मेरेडिथ

71

मान लें कि आपके पास हाथ करने के लिए एक हाइबरनेट सत्र है तो निम्नलिखित की तरह कुछ काम करना चाहिए:

Criteria c = session.createCriteria(Whatever.class);
Disjunction or = Restrictions.disjunction();
or.add(Restrictions.eq("name",searchString));
or.add(Restrictions.eq("address",searchString));
or.add(Restrictions.eq("phoneNumber",searchString));
c.add(or);

4
मुझे डिसंक्शन का सिंटैक्स पसंद है और इसे नाम देना या। यह अन्य समाधान की तुलना में बहुत अधिक पठनीय है।
ScArcher2

यह बहुत अच्छा था :) इसके अलावा @ ScArcher2 से सहमत हूं, यह बहुत पठनीय है और अधिक जटिल उदाहरण बना मुझे समझने में बहुत आसान करना पड़ा।
डस्टिन जेन्सेन

12
    //Expression :  (c1 AND c2) OR (c3)      


     Criteria criteria = session.createCriteria(Employee.class);

      Criterion c1 = Restrictions.like("name", "%e%");
      Criterion c2 = Restrictions.ge("salary", 10000.00);
      Criterion c3 = Restrictions.like("name", "%YYY%");
      Criterion c4 = Restrictions.or(Restrictions.and(c1, c2), c3);
      criteria.add(c4);

// एक ही चीज़ (सी 1 या सी 2) और सी 3, या किसी भी जटिल अभिव्यक्ति के लिए किया जा सकता है।


6
//Expression :  (c1 AND c2) OR (c3)      


 Criteria criteria = session.createCriteria(Employee.class);

  Criterion c1 = Restrictions.like("name", "%e%");
  Criterion c2 = Restrictions.ge("salary", 10000.00);
  Criterion c3 = Restrictions.like("name", "%YYY%");
  Criterion c4 = Restrictions.or(Restrictions.and(c1, c2), c3);
  criteria.add(c4);

  //Same thing can be done for (c1 OR c2) AND c3, or any complex expression.

3

बस अगर किसी को NHibernate के लिए एक ही सवाल के साथ इस पर ठोकर चाहिए:

ICriteria c = session.CreateCriteria(typeof (Whatever))
    .Add(Expression.Disjunction()
        .Add(Expression.Eq("name", searchString))
        .Add(Expression.Eq("address", searchString))
        .Add(Expression.Eq("phoneNumber", searchString)));

1

शर्तों का उपयोग और / और क्वेरी के विभिन्न स्तरों में डिस्जंक्शन का उपयोग करके किया जा सकता है

Criteria query = getCriteria("ENTITY_NAME");
query.add(Restrictions.ne("column Name", current _value));

Disjunction disjunction = Restrictions.disjunction();

if (param_1 != null)
    disjunction.add(Restrictions.or(Restrictions.eq("column Name", param1)));

if (param_2 != null)
    disjunction.add(Restrictions.or(Restrictions.eq("column Name", param_2)));

if (param_3 != null)
    disjunction.add(Restrictions.or(Restrictions.eq("column Name", param_3)));
if (param_4 != null && param_5 != null)
    disjunction.add(Restrictions.or(Restrictions.and(Restrictions.eq("column Name", param_4 ), Restrictions.eq("column Name", param_5 ))));

if (disjunction.conditions() != null && disjunction.conditions().iterator().hasNext())
    query.add(Restrictions.and(disjunction));

return query.list();

क्या db में नहीं पाए जाने वाले सभी तत्वों के लिए अशक्त होना संभव है?
fiddle

यह सुसंगत है: एक सूची सभी परिणामों के साथ वापस आ जाती है, चाहे कोई भी हो या नहीं।
टियागो मेडिसी

1

यह मेरे लिए एक शर्त के लिए काम किया है, वह भी एक IN शर्त के साथ और न कि इस चर्चा पर सबसे ज्यादा वोट किए गए जवाब के लिए:

criteria.add( Restrictions.or(
                    Restrictions.eq(ch.getPath(ch.propertyResolver().getXXXX()), "OR_STRING"),
                        Restrictions.in(ch.getPath(ch.propertyResolver().getYYYY()), new String[]{"AA","BB","CC"})
                    ));

परिणामी क्वेरी:

  and (
            this_.XXXX=? 
            or this_.YYYY in (
                ?, ?, ?
            )
        ) 

1

यदि कोई मानदंड के बजाय मानदंड का उपयोग कर रहा है, तो आप अपने सभी भावों को एक Predicateसूची में डाल सकते हैं और इस तरह से आकार के अनुसार एक OR डाल सकते हैं:

List<Predicate> predicates = new ArrayList<>();
if (...) {
  predicates.add(...);
}

criteriaQuery.where(cb.or(predicates.toArray(new Predicate[predicates.size()])));
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.