繁体   English   中英

Hibernate JPA,加入多个表

[英]Hibernate JPA, joining multiple tables

我有一个非常有趣的问题:如果我有 3 张桌子,我如何加入 hibernate? 示例:有表 A、B、C;

 @Entity
 public class A {
      private String name;
      private Int idA;
      ...
 } 

 @Entity
 public class B {
      private String lastName;
      private Int idB;
      ...
 }

 @Entity
 public class C {
      private String name;
      private String lastName;
      ...
 }

我的本机查询将如下所示:“在 a.idA = b.idB 和 b.lastName = c.lastName 和 a.name = c.name 上选择 * from a inner join b inner join c”

在休眠中,如果您想加入 2 个表,可以使用 @JoinColum,如果您要通过表 B 将表 A 与表 C 连接起来,则可以使用 @JoinTable。

所以在 HQL 查询中将如下所示:“从 A a 内连接 ab 作为 b 内连接 ac”,其中

@Entity
public class A {
...
@OneToMany
@JoinColumn(name="idB", referencedColumnName="idA")
private List<B> b;
...

@ManyToMany
@JoinTable(name = "B",
     joinColumns = {@JoinColumn(name="idB", referencedColumnName="ioA")},
     inverseJoinColumns = {@JoinColumn(name="lastName",referencedColumnName="lastName")}
 )
private List<C> c;
...
}

但仍然在这种情况下,我没有从表 A 到表 C 的直接访问权限,谁能解释一下我将如何获得

 select * from a inner join b inner join c on a.idA = b.idB and b.lastName = c.lastName and a.name = c.name 

在 HQL 和 JPA

为了让 JPA 了解您的数据库结构,您还需要定义关系。

@Entity
 public class A {
      private String name;
      private Int idA;

      @OneToMany(fetch = FetchType.LAZY, mappedBy = "a")
      private List<B> bs = new ArrayList()<>;
      ...
 } 

 @Entity
 public class B {
      private String lastName;
      private Int idB;

      @ManyToOne
      private A a;

      @OneToMany(fetch = FetchType.LAZY, mappedBy = "b")
      private List<C> cs = new ArrayList()<>;
      ...
 }

 @Entity
 public class C {
      private String name;
      private String lastName;

      @ManyToOne
      private B b;
      ...
 }

然后你可以做一些简单的事情

A a = yourARepository.findById(1);
List<B> bs = a.getBs();
For(B b : bs){
    List<C> cs = b.getCs();
}

这只是我头顶上的一个抄写员,给你一个想法。 您可能需要进行一些调整。 我可以尝试一下,等我回家后再修。 :)

并没有声称完全回答了这个问题,但至少提供了一个可能有帮助的线索(目前我由于缺乏声誉而无法发表评论,因此只能以这种方式发布)。

我有一些空闲时间来学习如何使用 CriteraBuilder 并希望实现 3 个表之间的连接。

在此处输入图片说明

问题是通过 id 获取用户的所有交易。

当然这里不需要双重连接,因为我们在帐户表中有 idusers,并且帐户和交易可以简单地通过帐户中的 idusers 过滤。 尽管如此,它允许展示我如何处理 3 个表的连接。

带有 2 个连接的代码,其中pIdusers是传递给我的方法的 idusers,而session是从 SessionFactory 获得的 Session:

    CriteriaBuilder cb = session.getCriteriaBuilder();

    CriteriaQuery<Transacs> cq1 = cb.createQuery(Transacs.class);
    Root<Transacs> transacsRoot = cq1.from(Transacs.class);

    Join<Transacs, Accounts> transacsAccounts = transacsRoot.join(Transacs_.IDACCOUNTS);
    Join<Accounts, Users> accountsUsers = transacsAccounts.join(Accounts_.IDUSERS);

    Predicate predicate = cb.equal(accountsUsers.get(Users_.IDUSERS), pIdusers);
    cq1.select(transacsRoot).where(predicate);
    TypedQuery<Transacs> query = session.createQuery(cq1);

    List<Transacs> result = query.getResultList();

以及我使用过的 Hibernate 实体:

@Entity
@Table(name = "users")
public class Users {
            
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "idusers", unique = true, nullable = false, insertable = false, updatable = false)
    private int idusers;
       
    @OneToMany(mappedBy="idusers")
    private Set<Accounts> accounts;
    ...
}

@Entity
@Table(name = "accounts")
public class Accounts {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "idaccounts", unique = true, nullable = false)
    private int idaccounts;
   
    @ManyToOne
    @JoinColumn(name="idusers", nullable=false)
    private Users idusers;

    @OneToMany(mappedBy="idaccounts")
    private Set<Transacs> transacs;
    ...
}

@Entity
@Table(name = "transacs")
public class Transacs {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "idtransacs", unique = true, nullable = false)
    private int idtransacs;

    @ManyToOne
    @JoinColumn(name="idaccounts", nullable=false)
    private Accounts idaccounts;
    ....
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM