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




معنى hibernate (6)

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

مثال

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

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


Answers

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

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:

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

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


تريد استخدام 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 .


حل جافا 8

إذا كنت ترغب في حل ما يلي:

  • يستخدم lambdas جافا 8
  • لا يعتمد على أي سحر JUnit
  • يسمح لك بالتحقق من وجود استثناءات متعددة داخل طريقة اختبار واحدة
  • التحقق من وجود استثناء يتم طرحه بواسطة مجموعة محددة من الخطوط داخل طريقة الاختبار الخاصة بك بدلاً من أي سطر غير معروف في طريقة الاختبار بالكامل
  • يعطي كائن الاستثناء الفعلي الذي تم طرحه حتى يمكنك فحصه بشكل أكبر

وهنا وظيفة الأداة التي كتبت:

public final <T extends Throwable> T expectException( Class<T> exceptionClass, Runnable runnable )
{
    try
    {
        runnable.run();
    }
    catch( Throwable throwable )
    {
        if( throwable instanceof AssertionError && throwable.getCause() != null )
            throwable = throwable.getCause(); //allows "assert x != null : new IllegalArgumentException();"
        assert exceptionClass.isInstance( throwable ) : throwable; //exception of the wrong kind was thrown.
        assert throwable.getClass() == exceptionClass : throwable; //exception thrown was a subclass, but not the exact class, expected.
        @SuppressWarnings( "unchecked" )
        T result = (T)throwable;
        return result;
    }
    assert false; //expected exception was not thrown.
    return null; //to keep the compiler happy.
}

( مأخوذة من مدونتي )

استخدمه على النحو التالي:

@Test
public void testThrows()
{
    RuntimeException e = expectException( RuntimeException.class, () -> 
        {
            throw new RuntimeException( "fail!" );
        } );
    assert e.getMessage().equals( "fail!" );
}




java hibernate