无法使用参考 类 编写条件

Unable to write criteria with reference classes

我们有这样的实体-

我们必须编写条件才能获得- 五所大学的名单,其中最近发生了任何部门的盛会,非政府组织名称"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)的拼贴就比较容易了,反正只有五张