Hibernate 无法使用引用类写入条件

Hibernate 无法使用引用类写入条件,hibernate,criteria,hibernate-criteria,Hibernate,Criteria,Hibernate Criteria,我们有这样的实体- 学院有许多系 NGO可以访问许多大学 我们必须编写标准以获得- 该系最近举办过任何一次活动并由非政府组织“xyz”访问过的五所学院的名单。 注意:在访问时,我们还必须保留一些其他记录,因此我们必须将NGO和学院与访问实体类建立一对一的关系,而不是学院与访问实体类建立一对多的关系 因此,我们的域(实体)变成这样:- class College{ @OneToMany(mappedBy="visitedTo") List<Visit> collegeVisites

我们有这样的实体-

  • 学院有许多系
  • NGO可以访问许多大学
我们必须编写标准以获得- 该系最近举办过任何一次活动并由非政府组织“xyz”访问过的五所学院的名单。

注意:在访问时,我们还必须保留一些其他记录,因此我们必须将NGO和学院与访问实体类建立一对一的关系,而不是学院与访问实体类建立一对多的关系

因此,我们的域(实体)变成这样:-

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;
}
班级学院{
@OneToMany(mappedBy=“visitedTo”)
List collegeVisites=新建ArrayList();
@OneToMany(mappedBy=“学院”)
List departments=new ArrayList();
}
类非政府组织{
@OneToMany(mappedBy=“visitedBy”)
List ngoVisites=new ArrayList();
@纵队
字符串名;
}
班级部{
@许多酮
大学;
@纵队
日期和日期;
}
课堂参观{
@许多酮
参观大学;
@许多酮
访问的非政府组织;
}
我首先使用java代码获取了最近组织的fest的所有部门订单,然后使用一些java检索desire colleges,如下所述。这不是一个好的做法,因为我们不需要从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;
}
}
Criteria cr=session.createCriteria(Department.class);
List departments=cr.add(Restriction.addOrder(Order.desc(“festDate”))).List();
List colleges=new ArrayList();
适用于(部门:部门){
对于(访问:department.getCollege().getCollegeVisites()){
if(visit.getName().equals(“xyz”)&&!colleges.contains(department.getCollege()){
colleges.add(department.getCollege())
打破
}
如果(学院大小()=>5){
打破
}
}

下面的代码解决了我的问题。谢谢你,阿米特

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 Server语法):


它返回拼贴画id和
min(festDate)
(由于order by,这是必需的)。您可以尝试获取完整拼贴画,但这并不容易。最后,使用
session.get(id)更容易获取拼贴画
之后,他们只剩下五个。

到目前为止你尝试了什么?@StefanSteinegger我已经附上了我的问题代码。请帮助我找到解决方案。我是新的标准。这几乎是正确的。当同一个学院中有多个系的festDate在范围内时,它不能正常工作。然后,同一所学院被关闭查找两次(甚至更多),setmaxResults(5)不再返回五所学院。要求显示“五所学院列表”。这也不容易解决。它需要子查询。问题是max results和order by需要在同一个查询或子查询上,但这总是会导致问题。@Stefan Steinegger。正是在连接有序部门时,hibernate提供重复拼贴,是否有任何hibernate会话方法只能获得uniqe结果。可以吗您可以帮助我们。问题是按festDate(在部门中)排序和拼贴的最大结果。您可以按拼贴分组和按min(festDate)排序。这可能是最简单的解决方案。当我们对引用实体应用条件并获取父表的数据时,会出现双重性的情况。子查询是否是此或会话的唯一解决方案?是否也提供了一些方法来处理此问题?您可以使用distinct(如SQL中的),但它很难控制,因为它取决于所选的列。您也可以使用“distinct root transformer”,这也很难控制,因为它在查询执行后尝试在内存中修复它,并且无法与setMaxResults一起正常工作。请阅读此处的详细信息:和此处
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);
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)