【问题标题】:hibernate - createCriteria or createAlias?休眠 - createCriteria 或 createAlias?
【发布时间】:2010-02-27 12:51:59
【问题描述】:

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

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

【问题讨论】:

  • 我不确定这是 Java/Hibernate 还是 C#/NHibernate 问题,所以已经回答了这两个问题。
  • CreateCriteria 和 CreateAlias 之间存在细微差别,各有目的。在stackoverflow.com/questions/899079/…查看我的回答这实际上是一个重复的问题

标签: nhibernate hibernate createcriteria


【解决方案1】:

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"));

【讨论】:

  • 对不起,我没有告诉你我正在为 C# 使用 nhibernate。因此,如果我没有正确理解 createAlias 与 createCriteria 相同,但 createCriteria 可以使用不同的联接,但 createAlias 只能使用内部联接。我说的对吗?
  • @senzacionale JoinType 参数可通过两个方法名称使用。
  • 它们不是一回事,请注意 CreateCriteria 公开了一个 ICriteria 对象,除了“根”ICriteria 对象之外还可以对其进行操作,请查看我在stackoverflow.com/questions/899079/…的回答
  • 这个答案完全不正确。根据您使用的方法,它会产生不同的结果:@sorrymissjackson 响应。
【解决方案2】:

添加到 xavierzhoa 的答案:

实际上,如果您链​​接Criteria 方法,您会注意到这两种方法之间存在很大差异。使用 createAlias 时,您将继续使用原始的 Criteria 对象,而使用 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

【讨论】:

  • 是的,非常有用
【解决方案3】:

请参考以下来自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;
}

【讨论】:

    【解决方案4】:
    Criteria criteria = (Criteria)sessionFactory.getCurrentSession().createCriteria(BillEntity.class)
            .createAlias("worksEntity", "worksEntity" ,JoinType.LEFT_OUTER_JOIN)
    

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

    (org.hibernate.sql.JoinType..LEFT_OUTER_JOIN)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-24
      • 2016-05-19
      • 2011-06-06
      • 2011-05-19
      相关资源
      最近更新 更多