Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate JPA,连接多个表_Java_Mysql_Hibernate_Jpa_Join - Fatal编程技术网

Java Hibernate JPA,连接多个表

Java Hibernate JPA,连接多个表,java,mysql,hibernate,jpa,join,Java,Mysql,Hibernate,Jpa,Join,我有一个非常有趣的问题:如果我有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

我有一个非常有趣的问题:如果我有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上的内部联接b内部联接c中选择*”

在hibernate中,如果要联接2个表,可以使用@joincolm;如果要通过表B联接表A和表C,可以使用@JoinTable

所以在HQL中,查询看起来像:“从A内部连接A.b作为b内部连接A.c”,其中


在HQL和JPA中,JPA要理解您的DB结构,还需要定义关系

@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类{
私有字符串名称;
私人国际开发协会;
@OneToMany(fetch=FetchType.LAZY,mappedBy=“a”)
private List bs=new ArrayList();
...
} 
@实体
公共B级{
私有字符串lastName;
私营国际开发银行;
@许多酮
私人A;
@OneToMany(fetch=FetchType.LAZY,mappedBy=“b”)
私有列表cs=newarraylist();
...
}
@实体
公共C类{
私有字符串名称;
私有字符串lastName;
@许多酮
私人B,;
...
}
然后你可以做一些简单的事情

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

那只是我头顶上的一个抄写员,给你一个想法。您可能需要做一些调整。我回家后可以试着修一下。:)

并没有确切回答这个问题,但至少给出了一个可能有帮助的线索(目前我无法评论,因为缺乏声誉,所以只能以这种方式发布)

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

问题是通过id获取用户的所有transacs

当然这里不需要双重连接,因为accounts表中有idusers,accounts和transacs可以通过idusers从accounts中进行简单的连接过滤。 尽管如此,它还是可以展示我是如何处理3个表的连接的

带有2个联接的代码,其中,pIdusers是idusers传递给我的方法,session是从SessionFactory获取的会话:

    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();
CriteriaBuilder cb=session.getCriteriaBuilder();
CriteriaQuery cq1=cb.createQuery(Transacs.class);
Root transacsRoot=cq1.from(Transacs.class);
Join transacsAccounts=transacsRoot.Join(Transacs_uuuz.IDACCOUNTS);
Join accountsUsers=transacsAccounts.Join(Accounts\uu0.IDUSERS);
谓词=cb.equal(accountsUsers.get(Users_u.IDUSERS),pIdusers);
cq1.select(transacroot)。其中(谓词);
TypedQuery=session.createQuery(cq1);
List 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;
    ....
}
@实体
@表(name=“users”)
公共类用户{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“idusers”,unique=true,nullable=false,insertable=false,updateable=false)
私人用户;
@OneToMany(mappedBy=“idusers”)
私人账户;
...
}
@实体
@表(name=“账户”)
公共类帐户{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“idaccounts”,unique=true,nullable=false)
私人帐户;
@许多酮
@JoinColumn(name=“idusers”,null=false)
私人用户iduser;
@OneToMany(mappedBy=“idaccounts”)
私人交易;
...
}
@实体
@表(name=“transacs”)
公共类交易{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“idtransacs”,unique=true,nullable=false)
私人国际直拨电话;
@许多酮
@JoinColumn(name=“idaccounts”,null=false)
私人账户;
....
}

你必须定义一种关系,不是吗?
    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();
@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;
    ....
}