【问题标题】:Hibernate - join three times same tableHibernate - 加入同一张表三次
【发布时间】:2012-08-22 17:16:35
【问题描述】:

我有这个问题:

两张表

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

tbl_activity 
   id* (int), 
   description (string)

两个表之间存在一种“一对多”的关系: tbl_activity (一个) --> tbl_suppliers (许多) ;这意味着每个供应商都可以为每个活动填写所有三个 id,甚至可以不填写任何活动(没有 id)。

我需要用列nameactivity1activity2activity3 显示tbl_suppliers 的记录。

在 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 中做同样的事情。我应该映射 3 次“一对多”活动字段吗?

【问题讨论】:

  • 您必须在 tbl_suppliers 中有 tbl_activity_id。对吗?
  • @RAS,他确实有,但连接列的名称是 activity1、activity2 和 activity3。

标签: hibernate join hql jpql


【解决方案1】:

表可以如下映射:

@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() 查询供应商并访问描述。

【讨论】:

  • 非常感谢!!如果我使用上述查询,它会起作用。如果我只是从供应商中选择它不会提取 3 个活动......我应该在“多对一”标签中设置“懒惰=假”吗? (我使用 xml 文件)。我也感谢我帖子的格式。
猜你喜欢
  • 2016-04-05
  • 2015-04-04
  • 1970-01-01
  • 2020-03-24
  • 2021-06-16
  • 2014-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多