hibernate - createCriteria还是createAlias?

sen*_*ale 27 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"));
Run Code Online (Sandbox Code Playgroud)

如何将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"));
Run Code Online (Sandbox Code Playgroud)

何时使用createCriteria和createAlias?我觉得那条船是一样的......

Lac*_*che 25

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

据推测,他们在旧版本中有所不同,但任何差异早已消失.

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

// 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"));
Run Code Online (Sandbox Code Playgroud)

  • 它们不是同一件事,请注意CreateCriteria公开了一个ICriteria对象,除了"root"ICriteria对象之外,它还可以在http://stackoverflow.com/questions/899079/nhibernate-createcriteria-vs-createalias/921042#上查看我的答案. 921042 (4认同)
  • 这个答案完全不正确。根据您使用的方法有不同的结果:@sorrymissjackson 响应。 (2认同)

sor*_*son 17

添加到xavierzhoa的答案:

实际上,如果链接Criteria方法,您会注意到这两种方法之间存在很大差异.使用时,您将继续处理原始Criteria对象createAlias,而使用时则使用更嵌套的范围createCriteria.

考虑一下:

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

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

但是,如果您始终分配并使用别名,则可以解决这些差异.喜欢:

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


小智 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;
}
Run Code Online (Sandbox Code Playgroud)