hibernate-クリエットリテリアまたはcreatealias?
-
23-09-2019 - |
質問
クラス「数学」と「ジョン」を撮影する生徒を検索したい場合は、彼のグループです。
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"));
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と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"));
他のヒント
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
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;
}
所属していません StackOverflow