首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >hibernate - createCriteria还是createAlias?

hibernate - createCriteria还是createAlias?
EN

Stack Overflow用户
提问于 2010-02-27 20:52:00
回答 4查看 76.5K关注 0票数 29

如果我想搜索那些上"Math“课程的学生,"John”是他的组:

我应该使用createCriteria还是createAlias?

代码语言:javascript
复制
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与初始标准放在一起?

代码语言:javascript
复制
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?我想boath是一样的..。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-02-28 02:22:43

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

想必它们在旧版本中是不同的,但任何差异都已经消失得无影无踪了。

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

代码语言:javascript
复制
// 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"));
票数 24
EN

Stack Overflow用户

发布于 2015-04-28 20:46:43

补充一下xavierzhoa的答案:

如果你链接Criteria方法,你会注意到这两个方法之间有很大的不同。在使用createAlias时,您将继续处理原始的Criteria对象,而在使用createCriteria时,您将处理更嵌套的作用域。

请考虑以下内容:

代码语言:javascript
复制
    Criteria c = getSession()
      .createCriteria(YourEntity.class)
      .createCriteria("someMember", "s")
      .add(Restrictions.eq("name", someArgument));  // checks YourEntity.someMember.name

对比

代码语言:javascript
复制
    Criteria c = getSession()
      .createCriteria(YourEntity.class)
      .createAlias("someMember", "s")
      .add(Restrictions.eq("name", someArgument));  // checks  YourEntity.name

但是,如果您总是分配和使用别名,您将能够解决这一差异。像这样:

代码语言:javascript
复制
    Criteria c = getSession()
      .createCriteria(YourEntity.class, "y")
      .createAlias("someMember", "s")
      .add(Restrictions.eq("y.name", someArgument));  // no more confusion
票数 21
EN

Stack Overflow用户

发布于 2013-01-21 20:58:48

请参考Hibernate中的以下源代码

代码语言:javascript
复制
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;
}
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2347359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档