Hibernate - 连接同一张表三次

标签 hibernate join hql jpql

我有这个问题:

两个表:

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

tbl_activity 
   id* (int), 
   description (string)

两个表之间存在一种“一对多”关系: tbl_activity (一) --> tbl_suppliers (许多) ;这意味着每个供应商都可以为每个事件甚至没有事件(无 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 中做同样的事情。我应该映射事件字段三次“一对多”吗?

最佳答案

表可以映射如下:

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

关于Hibernate - 连接同一张表三次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12155174/

相关文章:

java - Hibernate 框架 - 返回重复字段

java - HQL如何连接三张表

java - 如何在 Java 中为表 JOINS 实现 DAO/DTO?

java - 用于内连接查询的 Hibernate 映射对象

mysql - 将mysql子查询转换为join

mysql - 简单的 HQL/sql 查询..需要帮助吗?

java - 映射异常 : No Dialect mapping for JDBC type: 2002

hibernate - QueryDSL - 仅比较 dateTime 中的日期

java - Hibernate:在没有 'touching' 数据库的情况下对列表进行排序

java.lang.ClassCastException : [Ljava. lang.Object;与 com.spring.model.Instruction 不兼容