0

データベースに次のテーブル構造があります。

 Table A:                     Table B:                       Table C:
 _______________________      ______________________________  ______________________
 | Field | Type | Key  |     | Field | Type | Key          |  | Field | Type | Key  |   
 ______________________|     |_____________________________|  |_____________________|
 | a_id  | Int  | PRI  |     | a_id  | Int  | FK of A(a_id)|  | c_id  | Int  | PRI  |
 |     ...       ...   |     | c_id  | Int  | FK of C(c_id)|  |       ...           |
 |_____________________|      ______________________________  |_____________________|

そしてオブジェクト:

  class A {
        List<C> list;
        ...
   }

ここで、テーブル B によって結合されたすべての C オブジェクトを含むオブジェクト A をデータベースから受け取りたいと考えています。正しいオブジェクト A を受け取る基準はありますが、対応する C オブジェクトのリストを受け取る方法がわかりません。 :

    Criteria crit = ...;
    A a = crit.uniqueResult();

これは、正しい結果が得られ、基準で「翻訳」する必要がある SQL クエリです。

 select c.* 
 from A as a, 
      B as b, 
      C as c 
 where a.a_id = b.a_id and b.c_id = c.c_id;

基準の策定方法を知っている人はいますか?

4

1 に答える 1

1

あなたが持っている場合

class A {
    List<C> list;
    ...
}

Aとの両方C@Entitys の場合、基準は次のようになります。

// Create criteria on class A
Criteria criteria = session.createCriteria(A.class);

この時点で acriteria.list()を実行すると、すべてのAオブジェクトが取得され、それぞれにCID のみを持つ値のリストが含まれます。完全な C オブジェクトを取り込むには、追加の が必要です:

criteria.createAlias("list", "listC");

これにより、 のエイリアス (つまり、内部結合) が作成さAれますC。さて、あなたができるa (クラスのA) を持っていると仮定しますa.getList().get(i).getWhateverFieldFromC(); これで、 のAリストのすべてのインスタンスがC入力されました。

criteria.list()最後に a を実行してリストを取得することを忘れないでください。それだけです。

APSこれは(もちろん)エンティティとCが正しくマッピングされていることを前提としています。

于 2013-01-10T13:03:29.440 に答える