我试图在下面的类图中为作业门户网站用例建模。我已经让Skill实体既可以分享工作,又可以寻找可以重复使用的求职者。
我已经修改了我的oo设计,因为我正在分享技能,我认为它意味着它的M:N关系而不是1:N。
的问题:
如何使用hibernate进行以下操作?我需要求助于SQL吗?
我正在考虑为这个案例添加一个业务服务类作为JobPortal,使用一些方法,如下面的伪代码。如果可以回答方法 findJobsForSeeker 所需的HQL查询:
public class JobPortal {
public int createEmployer(String name, Address address) {
Employer e = null;
HBUtil.create(e = new Employer(name, address));
return e.getId();
}
public void addJobToEmployer(int empid, String jobName, String[][] skills) {
Employee e = HBUtil.get(empid, Employee.class);
Job j = new Job(jobName);
Skill s = null;
for(int i=0; i<skills.length; i++) {
s = HBUtil.find(skills[i][0], skills[i][1], Skill.class);
if (null == s) {
s = new Skill(skills[0], Interger.parseInt(skills[1])); //name, experience
}
j.add(s);
}
e.add(j);
HBUtil.save(e);
}
public int createSeeker(String name) {
Seeker s = null;
DBUtil.create(s = new Seeker(name));
return s.getId();
}
public void addSkillsToSeeker(int sid, String[][] skills) {
Seeker seeker = HBUtil.get(sid, Seeker.class);
for(int i=0; i<skills.length; i++) {
s = HBUtil.find(skills[i][0], skills[i][1], Skill.class);
if (null == s) {
s = new Skill(skills[0], Interger.parseInt(skills[1])); //name, experience
}
seeker.add(s);
}
HBUtil.save(seeker);
}
public void findJobsForSeeker(int sid) {
//what HQL do use ?
}
}
答案 0 :(得分:1)
要回答第一个问题:您要搜索要附加到新作业或搜索者的技能(使用HQL查询)。一旦找到技能,就可以将它们添加到新工作或寻求者的技能集合中:
List<Skill> skills = session.createQuery("select skill from Skill skill where ...")
.list();
for (Skill skill : skills) {
newJob.addSkill(skill);
}
我不理解你的第二个问题中使用的语法。如果你想找到所有具有一系列技能的所有技能的求职者:
select seeker from Seeker seeker where not exists (
select skill.id from Skill skill where skill in (:skillSet)
and skill.id not in (select skill2.id from Seeker seeker2
inner join seeker2.skills skill2
where seeker2 = seeker))
答案 1 :(得分:1)
你所要求的并不完全清楚,但我会尝试添加更多
1)如果你的问题是如何在hibernate中映射实体,你可以使用ManyToMany和JoinTable注释查找
(http://www.dzone.com/tutorials/java/hibernate/hibernate-example/hibernate-mapping-many-to-many-using-annotations-1.html)。
如果你创建一个真正的SeekerSkill实体(例如,一个搜索者有很多SeekerSkill,一个技能有很多SeekerSkill),你也可以使用2个OneToMany建模ManyToMany关系。
如果您的问题是如何使用数据库中的现有技能填充作业/求职者 - 那么我只需编写一次性SQL脚本来使用适当的技能(jobSkills和seekerSkills)填充我的关联表。
2)检查子集的一种方法,假设求职者/求职者不会多次列出相同的技能,那就是做技能的联合,由求职者组成,并确保你得到适当的数量。
例如,
搜索者 - 杰夫有技能:java,web开发,设计
工作 - 工作需要技能:java,design
杰夫正在寻找与他的技能相匹配的工作
这是SQL,因此您必须将其转换为HQL
select job_id from job_skill
inner join seeker_skill on job_skill.skill = seeker_skill.skill
where seeker_id = :seeker_id // this is a var for jeff's id
group by job_id
having count(*) > :num_required_skills // in our case, 2