0

以下のクラス図のように、求人ポータルのユースケースをモデル化しようとしました。再利用を希望する求職者だけでなく、仕事でもスキル エンティティを共有できるようにしました。

スキルを共有するので、oo のデザインを修正しました。これは、1:N ではなく M:N の関係を意味すると思います。

質問:

hibernate を使用して以下のことを行うにはどうすればよいですか? SQL に頼る必要がありますか?

  1. Skill は M:N の関係にあるため、関連テーブル JobSkill と SeekerSkill が必要になります。データベース内の既存のスキルを使用できるように、求人または求職者のインスタンスを作成する方法は?
  2. 仕事のスキル要件が候補者のスキルのサブセットになるようにスキル マッチングを行う必要があります。 a) 雇用者 e1: すべての候補者を見つける - 1{ 仕事
    + 1{候補者}N }N
    + 雇用主 }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);
}

2番目の質問で使用されている構文がわかりません。特定のスキルセットのすべてのスキルを持っているすべてのシーカーを検索する場合:

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 エンティティを作成する場合は、2 つの OneToMany を使用して ManyToMany 関係をモデル化することもできます (たとえば、1 つの Seeker には多くの SeekerSkill があり、1 つの Skill には多くの SeekerSkill があります)。

あなたの質問が、データベース内の既存のスキルをジョブ/求職者に入力する方法である場合、適切なスキル (jobSkills と seekerSkills) を関連付けテーブルに入力するための 1 回限りの SQL スクリプトを作成します。

2) サブセットを確認する方法の 1 つは、ジョブ/求職者が同じスキルを 2 回以上リストしないと仮定して、スキルを結合し、ジョブ/求職者ごとにグループ化し、適切な数を取得することを確認することです。

たとえば、
Seeker - jeff には次のスキルがあります: Java、Web 開発、デザイン
仕事 - 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 に答える