如果我想搜索那些上课“数学”和“约翰”是他的小组的学生:
我应该使用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?我认为那条船是一样的......
答案 0 :(得分:25)
CreateAlias和CreateCriteria 相同。唯一的区别是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"));
答案 1 :(得分:15)
添加到xavierzhoa的答案:
如果你链接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
答案 2 :(得分:12)
请参阅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;
}