我们有这样的实体 -
我们必须写标准来获得 - 五个大学的名单,其中任何一个部门的节日最近发生并由非政府组织名称" xyz"
访问注意:在访问时我们还要保留一些其他记录,因此我们必须与访问实体类建立一个非政府组织和学院之间的关系,而不是学院之间的许多关系。和访问。
所以我们的域名(实体)变成这样: -
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代码完成了这个我最近组织的fest获取所有部门顺序,然后检索欲望大学跟随一些java,如下所述。这是不好的做法,因为我们不需要从db获取所有部门。任何人为我提供的标准只能给我五个学院 -
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;
}
}
答案 0 :(得分:0)
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);
答案 1 :(得分:0)
下面的代码解决了我的问题。谢谢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);
答案 2 :(得分:0)
不幸的是,我是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 Server语法):
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)
它返回拼贴ID和min(festDate)
(由于顺序,这是必需的)。您可以尝试恢复完整拼贴,但这并不容易。最后,使用session.get(id)
之后更容易获得拼贴,无论如何它们只有五个。