29

「数学」のクラスを受講し、「ジョン」が彼のグループである学生を検索したい場合:

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 を使用しますか? ボートは同じだと思います...

4

4 に答える 4

24

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"));
于 2010-02-27T18:22:43.363 に答える
21

xavierzhoaの答えに追加:

実際には、2 つのメソッドの間にはかなり大きな違いがあり、メソッドをチェーンすると気付くでしょうCriteria。を使用する場合は、引き続き元のCriteriaオブジェクトで作業しますが、 を使用する場合createAliasは、よりネストされたスコープで作業します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
于 2015-04-28T12:46:42.783 に答える
13

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;
}
于 2013-01-21T12:58:48.320 に答える