Hibernate - CreaterCriteria أو Createalias؟
-
23-09-2019 - |
سؤال
إذا كنت أرغب في البحث في هؤلاء الطلاب الذين يأخذون "الرياضيات" و "جون" هي مجموعته:
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;
}