2

私はこの問題を抱えています:

2 つのテーブル:

tbl_suppliers
   id* (int), 
   name (string), 
   activity1 (int), 
   activity2 (int), 
   activity3 (int)

tbl_activity 
   id* (int), 
   description (string)

2 つのテーブルの間には一種の「1 対多」の関係があります。 tbl_activity(1) --> tbl_suppliers(多) ; これは、すべてのサプライヤーがすべての活動に対して 3 つの ID をすべて満たすか、または活動をまったく行わない (ID なし) ことができることを意味します。

tbl_suppliersname, activity1, activity2,のレコードを表示する必要がありますactivity3

SQL では、次のクエリで問題ありません。

SELECT s.id, s.name, a1.description activitystring1, 
    a2.description activitystring2, a3.description activitystring3 
FROM tbl_suppliers s 
LEFT JOIN tbl_activity a1 ON (s.activity1=a1.id) 
LEFT JOIN tbl_activity a2 ON (s.activity2=a2.id) 
LEFT JOIN tbl_activity a3 ON (s.activity3=a3.id)

HQL では同じことはできません。アクティビティ フィールドを「1 対多」に 3 回マップする必要がありますか?

4

1 に答える 1

3

テーブルは次のようにマッピングできます。

@Entity
@Table(name="tbl_activity")
public class Activity {
    @Id private Integer id;

    private String description;
    //getters, setters, etc.
}

@Entity
@Table(name="tbl_suppliers")
public class Supplier {
    @Id private Integer id;

    private String name;

    @JoinColumn(name = "activity1")
    @ManyToOne private Activity activity1;

    @JoinColumn(name = "activity2")
    @ManyToOne private Activity activity2;

    @JoinColumn(name = "activity3")
    @ManyToOne private Activity activity3;
    //getters, setters, etc.
}

元の SQL クエリは、次の JPQL で表現できます。

SELECT s.id, 
       s.name, 
       activity1.description, 
       activity2.description, 
       activity3.description
FROM Supplier s
  LEFT OUTER JOIN s.activity1 activity1
  LEFT OUTER JOIN s.activity2 activity2
  LEFT OUTER JOIN s.activity3 activity3

よりオブジェクト指向のアプローチを好む場合は、単純にサプライヤーを照会し、getActivity1.getDescription() を介して説明にアクセスできます。

于 2012-08-28T08:56:54.243 に答える