2

我有这个问题:

两张表

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

tbl_activity 
   id* (int), 
   description (string)

两个表之间存在一种“一对多”的关系: tbl_activity(one) --> tbl_suppliers(many) ;这意味着每个供应商都可以为每个活动或什至没有活动(无 id)填写所有三个 ID。

我需要显示tbl_suppliers带有列name, 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 中做同样的事情。我应该映射三倍“一对多”的活动字段吗?

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.
}

然后可以使用以下 JPQL 表示原始 SQL 查询:

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 回答