hibernate - createCriteria还是createAlias?

时间:2010-02-27 12:52:00

标签: nhibernate hibernate createcriteria

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

我应该使用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?我认为那条船是一样的......

3 个答案:

答案 0 :(得分:25)

在当前版本的Hibernate和NHibernate中,

CreateAlias和CreateCriteria 相同。唯一的区别是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"));

答案 1 :(得分:15)

添加到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

答案 2 :(得分:12)

请参阅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;
}