java شرح - كيف يمكنك "أو" معا المعايير عند استخدام استعلام المعايير مع السبات؟





معنى hibernate (6)


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

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

راجع مستند Hibernate here .

أحاول إجراء "OR" أساسي في ثلاثة حقول باستخدام استعلام معايير السبات.

مثال

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

أرغب في إنشاء استعلام معايير حيث يمكن أن تتطابق سلسلة البحث الخاصة بي مع "الاسم" أو "العنوان" أو "رقم الهاتف".




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

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 ، أو أي تعبير معقد.




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

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



//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 ، يمكنك استخدام الاستعلامات الفرعية التي يتم تعريفها على أنها DetachedCriteria. لست متأكدا مما إذا كان يعمل نفس الشيء في Java ، على الأرجح هو نفسه:

DetachedCriteria pets = DetachedCriteria.For<Pet>("pet")
  .SetProjection(Projections.Property("pet.ownername"))
  .Add(/* some filters */ );

session.CreateCriteria(typeof(Owner))
  .Add(Subqueries.PropertyIn("name", pets);

يفترض أنه تم ضمه باستخدام اسم المالك.







java hibernate