【发布时间】:2015-07-17 08:39:34
【问题描述】:
我在 Eclipse 中使用休眠。
我有 3 个一对多关系表。
ONE [Company] --> MANY [Officer],以及 ONE [Officer] --> MANY [Task]。
它们都有唯一的 id(companyId、officerId、taskId)。
目前我知道如何找到所有属于某个官员的任务,我也知道如何找到所有属于某个公司的官员。
这里是sn-p的代码:
public static ArrayList<Officer> getOfficersByCompany(Company company){
ArrayList<Officer> officers = new ArrayList<Officer>();
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Officer.class);
detachedCriteria.add(Restrictions.eq(Key.COMPANY, company));
detachedCriteria.add(Restrictions.eq(Key.OBJSTATUS, Value.ACTIVED));
List<Object> list = HibernateUtil.detachedCriteriaReturnList(detachedCriteria);
for(Object o : list){
officers.add((Officer) o);
}
return officers;
}
下面是 HibernateUtil 类中的 detachedCriteriaReturnList 方法。
public static List<Object> detachedCriteriaReturnList(DetachedCriteria dc){
Session session = getSessionFactory().openSession();
session.beginTransaction();
Criteria criteria = dc.getExecutableCriteria(session);
List<Object> list = criteria.list();
session.getTransaction().commit();
session.close();
return list;
}
然而,如果我试图让所有任务属于一个公司,我应该如何实现代码。我试过使用:detachedCriteria.add(Restrictions.allEq(officers));
public static ArrayList<Task> getTasksByOfficers(Map<String, Object> officers){
ArrayList<Task> tasks = new ArrayList<Task>();
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Task.class);
detachedCriteria.add(Restrictions.allEq(officers));
List<Object> list = HibernateUtil.detachedCriteriaReturnList(detachedCriteria);
for(Object o : list){
tasks.add((Task) o);
}
return tasks;
}
但我意识到地图只存储唯一的键和值对,如果我尝试使用二副的 id,第一个将被替换。
或者有没有其他方法可以更快更高效地进行选择?
【问题讨论】:
-
您只需要两个 join company->officer->task 和一个 distinct,因为官员可能共享相同的任务:为了简洁和可读性,我会使用 HQL 查询。
-
@medveshonok117 感谢您的关注,但我很确定在我的情况下,官员不会分担相同的任务。你知道如何使用标准来做到这一点吗?请多解释一下?非常感谢:)
标签: java hibernate hibernate-criteria