4
+-------+    +--------------|     +-------+
| BOY   |    | BOY_GIRL     |     | GIRL  | 
+-------+    +--------------|     +-------+
| id    |    | id           |     | id    |
| name  |    | boy_id       |     | name  |
| birth |    | girl_id      |     | birth |
+-------+    | start_dating |     +-------+
             +--------------|

START_DATINGTIMESTAMPまたはのタイプですDATE

私は多対多の関係を持つ2つのBean BoyとGirlを持っています

@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "BOY_GIRL", joinColumns = {@JoinColumn(name = "BOY_ID")}, inverseJoinColumns = {@JoinColumn(name = "GIRL_ID")})
public Set<Girl> getGirls() {
    return girls;
}

さて、条件付きの女の子のリストを取得したい場合、HQL で選択クエリを実行するにはどうすればよいですか。

where boy_id = (some_boy_id) and START_DATING > (some_timestamp)
4

4 に答える 4

4

エンティティ モデルが正しくないと思います。関係属性を表す 3 番目のエンティティが必要であり、Boy と Girl の両方をそのエンティティに 1 対 1 でマッピングする必要があります。それ以外の場合、クエリの条件として関係属性を指定する方法はありません。あなたの場合は starting_date です。このリンクを見てください。追加の属性を使用して結合テーブルをマップする方法の詳細な説明を見つけることができます。

于 2012-10-31T09:06:37.133 に答える
4

tableは単純な多対多BoyGirlテーブルではないため、クラスを作成する必要があると思います(そうである場合、列は と のみである必要があります)。したがって、クラスを作成してから、1対多でマップし、1対多でマップする必要がありますBOY_GIRLboy_idgirl_idBoyGirlBOYBOY_GIRLGIRLBOY_GIRL

テーブル関係

+-------+               +--------------+               +-------+
| BOY   |               | BOY_GIRL     |               | GIRL  | 
+-------+               +--------------|               +-------+
| id    | 0..* --- 1..1 | id           | 1..1 --- 0..* | id    |
| name  |               | boy_id       |               | name  |
| birth |               | girl_id      |               | birth |
+-------+               | start_dating |               +-------+
                        +--------------+

Java クラス

public class BoyGirl {
  private long id;
  private Boy boy;
  private Girl girl;
  private Date startDating;
}

public class Boy {
  //other attributes omitted
  private Set<BoyGirl> boyGirls;
}

public class Girl {
  //other attributes omitted
  private Set<BoyGirl> boyGirls;
}

必要な選択クエリ

// I'm using criteria here, but it will have the same result as your HQL

public List getGirls(Boy boy, Date startDating) {
  Criteria c = sessionFactory.getCurrentSession().createCriteria(BoyGirl.class);
  c.add(Restrictions.eq("boy.id", boy.getId());
  c.add(Restrictions.lt("startDating", startDating);

  List<BoyGirl> boyGirls = (List<BoyGirl>) c.list();
  // at this point you have lazily fetch girl attributes
  // if you need the girl  attributes to be initialized uncomment line below
  // for (BoyGirl boyGirl : boyGirls) Hibernate.initialize(boyGirl.getGirl());

  return boyGirls;
}
于 2012-10-31T09:11:24.357 に答える
1

中間テーブルBOY_GIRLには追加の属性 ( start_dating) があるため、ドメイン モデルに別の中間エンティティを作成する必要があります。

@Table(name="BOY_GIRL")
class Relationship {

  @Id
  long id;

  @ManyToOne
  Boy boy;

  @ManyToOne;
  Girl girl;

  @Column
  Date startDating;
}
于 2012-10-31T09:13:09.020 に答える
0

日付情報を結合テーブル内に直接保持することはあまり良くないと思います (これの目的は単に男の子と女の子を関連付けることであるため)。

ただし、現在の構造を維持し、HQL で解決したい場合は、次のようなことができるはずです。

SELECT g FROM GIRL g, BOY_GIRL bg 
WHERE bg.start_dating = :revelantdate 
    AND bg.boy_id = :boyid
    AND g.id = bg.girl_id
于 2012-10-31T09:19:58.847 に答える