в спящем режиме 3.3.2;
давайте посмотрим на код источника:
public Criteria createAlias(String associationPath, String alias, int joinType) {
new Subcriteria( this, associationPath, alias, joinType );
return this;
}
public Criteria createCriteria(String associationPath, int joinType) {
return new Subcriteria( this, associationPath, joinType );
}
createCriteria возвращает подкритерии, поэтому все операции выполняются по подкритериям;
но createAlias возвращает критерии, которые создают подкритерии;
пример 1.
Ad многоToone Adgroup; все они имеют свойства "name"
Criteria criteria1 = s.createCriteria(Ad.class, "ad").add(Restrictions.eq("ad.id", Long.valueOf(343909))) ;
Criteria criteria2 = criteria1.createCriteria("adGroup")
.setProjection(Projections.property("name"))
List list = criteria2.list();
List list = s.createCriteria(Ad.class, "ad").add(Restrictions.eq("ad.id", Long.valueOf(343909)))
.createAlias("adGroup", "adGroup")
.setProjection(Projections.property("name"))
.list();
скажем, имя в группе объявлений "aaaa"
имя в объявлении "bbbb"
в первом утверждении значение name называется результатом от adGroup entity = "aaaa".
во втором утверждении значение name называется "result" из рекламного объекта "bbbb".
ps1: если в сущности группы объявлений отсутствуют свойства "name", но в сущности объявления первый оператор выдаст исключение: org.hibernate.QueryException: не удалось разрешить свойство: name of: AdGroup;
но если вы измените на ".setProjection (Projection.property (" ad.name "))", будет нормально вернуть значение имени объявления
ps2: список вызовов первого оператора () по критериям2, но режим гибернации будет обрабатываться из корневых критериев = критерии1; итоговый sql будет содержать "where ad.id = 343909" из критерия 1;
пример 2.
учитель oneToMany ученик
студент oneToMany студент
List list1 = s.createCriteria(Teacher.class, "teacher").add(Restrictions.eq("teacher.id", Long.valueOf(343909)))
.createCriteria("students").createCriteria("books")
.list();
List list2 = s.createCriteria(Teacher.class, "teacher").add(Restrictions.eq("teacher.id", Long.valueOf(343909)))
.createAlias("students").createCriteria("books").setProjection(Projections.property("name"))
.list();
второе выражение выдает исключение: org.hibernate.QueryException: не удалось разрешить свойство: books of: Teacher;
потому что книги являются собственностью студента
это разница между createCriteria и createAlias;