2010-02-27 38 views
25

如果我想搜索那些参加“数学”和“约翰”课的学生是他的小组:hibernate - createCriteria或createAlias?

shoud我使用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")); 

如何将子查询1和子查询2与初始条件一起?

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?我认为这些都是一样的...

+0

我不确定这是Java/Hibernate还是C#/ NHibernate的问题,所以都有回答。 – 2010-02-27 18:31:28

+2

CreateCriteria和CreateAlias之间有细微的差别,每个都有一个目的。 检查我的答案在http://stackoverflow.com/questions/899079/nhibernate-createcriteria-vs-createalias/921042#921042 这实际上是一个重复的问题 – Jaguar 2010-03-05 11:45:56

回答

24

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

大概他们在旧版本中有所不同,但任何差异早已消失。

别名可以在另一个别名来定义,所以第一个实施例可被写为:

// 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")); 
+0

抱歉没有告诉你,我使用nhibernate for C# 。所以如果我不喜欢正确的createAlias和createCriteria是一样的,但是createCriteria可以使用不同的join,但createAlias只能使用inner join。我对吗? – senzacionale 2010-02-27 19:10:31

+0

@senzacionale JoinType参数可通过两种方法名称获得。 – 2010-02-27 19:25:13

+4

它们不是同一个东西 请注意,CreateCriteria公开一个ICriteria对象,除了“根”IC标准对象之外,还可以对其进行操作 请检查我的答案 http://stackoverflow.com/questions/899079/nhibernate-createcriteria-vs- createalias/921042#921042 – Jaguar 2010-03-05 11:48:28

11

请参考下面的源代码从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; 
} 
10

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