2010-02-27 17 views
25

Jeśli chcę przeszukać tych uczniów, którzy wezmą udział w zajęciach "Matematyka" i "Jan", to jego grupa:hibernacja - createCriteria lub createAlias?

shoud Używam createCriteria lub 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")); 

jak umieścić podkwerendę1 i podkwerendę2 wraz z kryteriami początkowymi?

Kiedy używać funkcji createCriteria i kiedy createAlias? Myślę, że boath są takie same ...

+0

Nie jestem pewien, czy było to pytanie Java/Hibernate lub C#/NHibernate, więc odpowiedziałem na oba. –

+2

Istnieją subtelne różnice między CreateCriteria i CreateAlias, każdy ma cel. Sprawdź moją odpowiedź na http://stackoverflow.com/questions/899079/nhibernate-createcriteria-vs-createalias/921042#921042 To jest rzeczywiście duplikat pytanie – Jaguar

Odpowiedz

24

CreateAlias ​​i CreateCriteria są identyczne w aktualnych wersjach Hibernate i NHibernate. Jedyna różnica polega na tym, że CreateCriteria ma 2 dodatkowe przeciążenia bez parametru aliasu.

Prawdopodobnie różniły się one w starszej wersji, ale wszelkie różnice dawno minęły.

Alias ​​może być definiowane w kategoriach innego aliasu, więc pierwszy przykład można zapisać jako:

// 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

Niestety nie powiedziałem, że używam nhibernate dla C# . Więc jeśli undesrtand poprawnie utworzyAlias ​​będzie taki sam jak createCriteria, ale createCriteria może używać różnych sprzężeń, ale createAlias ​​może używać wyłącznie sprzężenia wewnętrznego. Czy mam rację? – senzacionale

+0

@senzacionale Parametr JoinType jest dostępny za pośrednictwem obu nazw metod. –

+4

to nie to samo, co Należy zauważyć, że CreateCriteria udostępnia obiekt ICriteria, który można modyfikować oprócz obiektu "root" ICriteria sprawdź moją odpowiedź na http://stackoverflow.com/questions/899079/nhibernate-createcriteria-vs- createalias/921042 # 921042 – Jaguar

11

Proszę odnieść się do poniższego kodu źródłowego z 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

dodanie do Odpowiedź Xavierzhoa:

Istnieje naprawdę duża różnica między tymi dwoma metodami, które można zauważyć, jeśli łączysz metody Criteria. Będziesz kontynuować pracę nad oryginalnym obiektem Criteria podczas korzystania z createAlias, podczas gdy pracujesz nad zasięgiem bardziej zagnieżdżonym podczas korzystania z createCriteria.

Rozważ to:

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

kontra

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

Jeśli jednak zawsze przypisać i korzystać z aliasu będzie można obejść różnicy. Podobno:

Criteria c = getSession() 
     .createCriteria(YourEntity.class, "y") 
     .createAlias("someMember", "s") 
     .add(Restrictions.eq("y.name", someArgument)); // no more confusion 
Powiązane problemy