2010-02-27 30 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 
相關問題