سؤال

إذا كنت أرغب في البحث في هؤلاء الطلاب الذين يأخذون "الرياضيات" و "جون" هي مجموعته:

Shoud أنا أستخدم CreaterCriteria أو Createalias؟

Criteria:

Criteria criteria = session.createCriteria(Student.class);
Criteria subquery1 = criteria.createCriteria("courses", course).add(Restrictions.eq(course.name, "Math"));
Criteria subquery2 = criteria.createCriteria("group", student).add(Restrictions.eq(student.name, "John"));

كيف تضع subquery1 و subquery2 مع المعايير الأولية؟

Alias:

Criteria criteria = session.createCriteria(Student.class).
createAlias("courses", course).add(Restrictions.eq(course.name, "Math")).
createCriteria("group", student).add(Restrictions.eq(student.name, "John"));

متى تستخدم CreaterCriteria وعندما Createalias؟ أعتقد أن براث هي نفسها ...

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

المحلول

kreasealias و createCriteria مطابق في الإصدارات الحالية من Hibernate و nhibernate. الفرق الوحيد هو أن CreaterCriteria لديه حمامتين إضافيتين بدون معلمة الاسم المستعار.

من المفترض أنها كانت مختلفة في إصدار أقدم ، ولكن أي اختلافات قد ولت منذ فترة طويلة.

يمكن تعريف الاسم المستعار من حيث الاسم المستعار الآخر ، لذلك يمكن كتابة مثالك الأول على النحو التالي:

// Java
Criteria criteria = session.createCriteria(Student.class)
    .createAlias("courses", "course")
    .createAlias("course.group", "student")
    .add(Restrictions.eq("course.name", "Math"))
    .add(Restrictions.eq("student.name", "John"));

// C#
ICriteria criteria = session.CreateCriteria<Student>()
    .CreateAlias("Courses", "course")
    .CreateAlias("course.Group", "student")
    .Add(Restrictions.Eq("course.Name", "Math"))
    .Add(Restrictions.Eq("student.Name", "John"));

نصائح أخرى

إضافة إلى إجابة Xavirzhoa:

هناك بالفعل فرق كبير بين الطريقتين اللتين ستلاحظهما إذا كنت سلسلة Criteria طُرق. سوف تستمر في العمل على الأصل Criteria كائن عند استخدام createAlias, ، بينما تعمل على نطاق أكثر متداخلة عند استخدام createCriteria.

النظر في هذا:

    Criteria c = getSession()
      .createCriteria(YourEntity.class)
      .createCriteria("someMember", "s")
      .add(Restrictions.eq("name", someArgument));  // checks YourEntity.someMember.name

عكس

    Criteria c = getSession()
      .createCriteria(YourEntity.class)
      .createAlias("someMember", "s")
      .add(Restrictions.eq("name", someArgument));  // checks  YourEntity.name

ومع ذلك ، إذا قمت دائمًا بتعيين الاسم المستعار واستخدمته ، فستتمكن من العمل حول الفرق. يحب:

    Criteria c = getSession()
      .createCriteria(YourEntity.class, "y")
      .createAlias("someMember", "s")
      .add(Restrictions.eq("y.name", someArgument));  // no more confusion

يرجى الرجوع إلى رمز المصدر التالي من السبات

public Criteria createCriteria(String associationPath, String alias, int joinType) {
    return new Subcriteria( this, associationPath, alias, joinType );
}


public Criteria createAlias(String associationPath, String alias, int joinType) {
    new Subcriteria( this, associationPath, alias, joinType );
    return this;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top