Hibernate- createcriteria或createalias?
-
23-09-2019 - |
题
如果我想搜索那些参加“数学”和“约翰”的学生是他的小组:
我使用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和何时使用createAleias?我认为船了一样...
解决方案
createalias和createcriteria是 完全相同的 在当前的冬眠和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的答案:
实际上,这两种方法之间有很大的区别 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
请参阅冬眠的以下源代码
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