كيف "أو" معايير معا عند استخدام معايير الاستعلام مع السبات?

StackOverflow https://stackoverflow.com/questions/57484

  •  09-06-2019
  •  | 
  •  

سؤال

أنا أحاول أن أفعل الأساسية "أو" على ثلاثة مجالات استخدام السبات معايير الاستعلام.

على سبيل المثال

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

أود أن بناء معايير الاستعلام حيث سلسلة البحث يمكن أن تتطابق مع "اسم" أو "عنوان" أو "phoneNumber".

هل كانت مفيدة؟

المحلول

تريد استخدامها Restrictions.disjuntion().مثل ذلك

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

انظر السبات doc هنا.

نصائح أخرى

على افتراض لديك السبات الدورة إلى اليد ثم شيء مثل التالية ينبغي أن تعمل:

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);
    //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);

//نفس الشيء يمكن عمله بالنسبة (c1 أو c2) و c3, أو أي مجمع التعبير.

//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.

فقط في حالة أي شخص يجب أن تتعثر هذه مع نفس السؤال 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)));

شروط يمكن تطبيقها باستخدام و / أو في مستويات مختلفة من الاستعلام باستخدام انفصال

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();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top