29

如果我想搜索那些上“数学”课的学生,“约翰”是他的组:

我应该使用 createCriteria 还是 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"));

何时使用 createCriteria 以及何时使用 createAlias?我认为船是一样的...

4

4 回答 4

24

CreateAlias 和 CreateCriteria在 Hibernate 和 NHibernate 的当前版本中是相同的。唯一的区别是 CreateCriteria 有 2 个没有别名参数的额外重载。

据推测,它们在旧版本中有所不同,但任何差异早已不复存在。

别名可以根据另一个别名来定义,因此您的第一个示例可以写为:

// 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"));
于 2010-02-27T18:22:43.363 回答
21

添加到 xavierzhoa 的答案:

如果链接方法,您会注意到这两种方法之间实际上存在很大差异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
于 2015-04-28T12:46:42.783 回答
13

请参考以下来自 Hibernate 的源代码

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;
}
于 2013-01-21T12:58:48.320 回答
0
Criteria criteria = (Criteria)sessionFactory.getCurrentSession().createCriteria(BillEntity.class)
        .createAlias("worksEntity", "worksEntity" ,JoinType.LEFT_OUTER_JOIN)

而不是写(Jointype)使用导入文件作为

(org.hibernate.sql.JoinType..LEFT_OUTER_JOIN)
于 2021-08-31T10:32:52.433 回答