无法使用引用类

时间:2016-02-15 13:12:56

标签: hibernate criteria hibernate-criteria

我们有这样的实体 -

  • 学院有很多部门。
  • 非政府组织可以访问许多学院。

我们必须写标准来获得 - 五个大学的名单,其中任何一个部门的节日最近发生并由非政府组织名称" 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;
}
}

3 个答案:

答案 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)之后更容易获得拼贴,无论如何它们只有五个。