无法使用参考 类 编写条件
Unable to write criteria with reference classes
我们有这样的实体-
- 学院有很多系。
- NGO可以访问很多高校
我们必须编写条件才能获得-
五所大学的名单,其中最近发生了任何部门的盛会,非政府组织名称"xyz"访问过。
注意:在访问的时候我们还要维护一些其他的记录,所以我们要和访问实体建立NGO和学院的oneToMany关系class,而不是 College 和 Visit 之间的多对多关系。
所以我们的域(实体)变成这样:-
class College{
@OneToMany(mappedBy="visitedTo")
List<Visit> collegeVisites=new ArrayList<Visit>();
@OneToMany(mappedBy="college")
List<Department> departments=new ArrayList<Department>();
}
class NGO{
@OneToMany(mappedBy="visitedBy")
List<Visit> ngoVisites=new ArrayList<Visit>();
@Column
String name;
}
class Department{
@ManyToOne
College college;
@Column
Date festDate;
}
class Visit{
@ManyToOne
College visitedTo;
@ManyToOne
NGO visitedBy;
}
我是通过使用 java 代码完成的,首先我通过最近组织的节日获取了所有部门订单,然后在一些 java 之后检索了想要的大学,如前所述 below.That 不是好的做法因为我们没有必要从 db.Can 获取所有部门,所以任何人都可以给我提供只能给我五所大学的标准-
Criteria cr=session.createCriteria(Department.class);
List<Department> departments=cr.add(Restriction.addOrder(Order.desc("festDate"))).list();
List<College> colleges=new ArrayList<College>();
for(Department department:departments){
for(Visit visit :department.getCollege().getCollegeVisites()){
if(visit.getName().equals("xyz")&& !colleges.contains(department.getCollege()){
colleges.add(department.getCollege())
break;
}
if(colleges.size()=>5){
break;
}
}
Criteria criteria = session.createCriteria(Department.class)
.createAlias("college", "college")
.createAlias("college.collegeVisites", "collegeVisites")
.add(Restrictions.eq("collegeVisites.name","xyz" ))
.addOrder(Order.desc("festDate"))
.setMaxResults(5);
下面的代码解决了我的 problem.Thanks Amit.
Criteria criteria = session.createCriteria(Collage.class)
.createAlias("collegeVisites", "collegeVisites")
.createAlias("departments", "departments")
.add(Restrictions.eq("collegeVisites.name","xyz" ))
.addOrder(Order.desc("departments.festDate"))
.setMaxResults(5);
不幸的是,我是一名 NHibernate 用户和 C# 程序员,所以请耐心等待,这里可能存在一些语法问题。
Criteria collageQuery = session
.createCriteria(Collage.class, "collages")
.createAlias("collageVisites", "collageVisites")
.createAlias("departments", "departments")
.setProjection(Projections.projectionList()
.add(Projections.groupProperty("collages.id"))
.add(Projections.min("departments.festDate", "minfestDate")))
.add(Restrictions.eq("collegeVisites.name","xyz" ))
.addOrder(Order.desc("minfestDate"))
.setMaxResults(5);
应该创建这样的查询(特定于 DBMS,此处可能 SQL 服务器语法):
SELECT TOP (5)
collage.id,
min(department.festDate)
FROM collage
inner join collageVisites ...
inner join department
WHERE collageVisites.name = "xyz"
GROUP BY collage.id
ORDER BY min(department.festDate)
它 returns 拼贴 ID 和 min(festDate)
(由于排序依据,这是必需的)。您可以尝试找回完整的拼贴画,但这并不容易。到最后再弄session.get(id)
的拼贴就比较容易了,反正只有五张
我们有这样的实体-
- 学院有很多系。
- NGO可以访问很多高校
我们必须编写条件才能获得- 五所大学的名单,其中最近发生了任何部门的盛会,非政府组织名称"xyz"访问过。
注意:在访问的时候我们还要维护一些其他的记录,所以我们要和访问实体建立NGO和学院的oneToMany关系class,而不是 College 和 Visit 之间的多对多关系。
所以我们的域(实体)变成这样:-
class College{
@OneToMany(mappedBy="visitedTo")
List<Visit> collegeVisites=new ArrayList<Visit>();
@OneToMany(mappedBy="college")
List<Department> departments=new ArrayList<Department>();
}
class NGO{
@OneToMany(mappedBy="visitedBy")
List<Visit> ngoVisites=new ArrayList<Visit>();
@Column
String name;
}
class Department{
@ManyToOne
College college;
@Column
Date festDate;
}
class Visit{
@ManyToOne
College visitedTo;
@ManyToOne
NGO visitedBy;
}
我是通过使用 java 代码完成的,首先我通过最近组织的节日获取了所有部门订单,然后在一些 java 之后检索了想要的大学,如前所述 below.That 不是好的做法因为我们没有必要从 db.Can 获取所有部门,所以任何人都可以给我提供只能给我五所大学的标准-
Criteria cr=session.createCriteria(Department.class);
List<Department> departments=cr.add(Restriction.addOrder(Order.desc("festDate"))).list();
List<College> colleges=new ArrayList<College>();
for(Department department:departments){
for(Visit visit :department.getCollege().getCollegeVisites()){
if(visit.getName().equals("xyz")&& !colleges.contains(department.getCollege()){
colleges.add(department.getCollege())
break;
}
if(colleges.size()=>5){
break;
}
}
Criteria criteria = session.createCriteria(Department.class)
.createAlias("college", "college")
.createAlias("college.collegeVisites", "collegeVisites")
.add(Restrictions.eq("collegeVisites.name","xyz" ))
.addOrder(Order.desc("festDate"))
.setMaxResults(5);
下面的代码解决了我的 problem.Thanks Amit.
Criteria criteria = session.createCriteria(Collage.class)
.createAlias("collegeVisites", "collegeVisites")
.createAlias("departments", "departments")
.add(Restrictions.eq("collegeVisites.name","xyz" ))
.addOrder(Order.desc("departments.festDate"))
.setMaxResults(5);
不幸的是,我是一名 NHibernate 用户和 C# 程序员,所以请耐心等待,这里可能存在一些语法问题。
Criteria collageQuery = session
.createCriteria(Collage.class, "collages")
.createAlias("collageVisites", "collageVisites")
.createAlias("departments", "departments")
.setProjection(Projections.projectionList()
.add(Projections.groupProperty("collages.id"))
.add(Projections.min("departments.festDate", "minfestDate")))
.add(Restrictions.eq("collegeVisites.name","xyz" ))
.addOrder(Order.desc("minfestDate"))
.setMaxResults(5);
应该创建这样的查询(特定于 DBMS,此处可能 SQL 服务器语法):
SELECT TOP (5)
collage.id,
min(department.festDate)
FROM collage
inner join collageVisites ...
inner join department
WHERE collageVisites.name = "xyz"
GROUP BY collage.id
ORDER BY min(department.festDate)
它 returns 拼贴 ID 和 min(festDate)
(由于排序依据,这是必需的)。您可以尝试找回完整的拼贴画,但这并不容易。到最后再弄session.get(id)
的拼贴就比较容易了,反正只有五张