0

我试图对工作门户用例进行建模,如下面的类图所示。我已将 Skill 实体设置为可供工作以及希望重用的求职者共享。

我已经修改了我的 oo 设计,因为我分享了我认为这意味着它的 M:N 关系而不是 1:N 的技能。

问题:

如何使用 hibernate 做以下事情?我需要求助于 SQL 吗?

  1. 由于 Skill 具有 M:N 关系,因此需要关联表 JobSkill 和 SeekerSkill。如何创建工作或求职者实例,以便他们使用数据库中的现有技能?
  2. 我需要进行技能匹配,以便工作技能要求是候选人技能的子集:
    a)雇主 e1:找到所有候选人 - 1{job + 1{candidate}N }N
    b)候选人 c1:找到所有工作 - 1{job + 雇主 }N

我正在考虑为这种情况添加一个业务服务类作为 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 ? 
  }

}
4

2 回答 2

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))
于 2012-07-07T12:08:45.730 回答
1

不完全清楚你在问什么,但我会尝试添加更多

1)如果您的问题是如何在休眠中映射实体,您可以使用 ManyToMany 和 JoinTable 注释查找

(http://www.dzone.com/tutorials/java/hibernate/hibernate-example/hibernate-mapping-many-to-many-using-annotations-1.html)。

如果您创建了一个实际的 SeekerSkill 实体(例如,一个 Seeker 有许多 SeekerSkills,而一个 Skill 有许多 SeekerSkills),您也可以使用 2 OneToMany 建模 ManyToMany 关系。

如果您的问题是如何使用数据库中的现有技能填充工作/求职者 - 那么我只需编写一个一次性 SQL 脚本来使用适当的技能(jobSkills 和 seekerSkills)填充我的关联表。

2)检查子集的一种方法,假设工作/求职者没有多次列出相同的技能,那就是加入技能,按工作/求职者分组,并确保你得到适当的计数。

例如
Seeker - jeff 有技能:java、web 开发、设计
Job - jobA 需要技能:java、设计

杰夫正在寻找与他的技能相匹配的工作

这是 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
于 2012-07-07T14:11:40.663 回答