连接2个以上表时出现Hibernate连接问题

连接2个以上表时出现Hibernate连接问题,hibernate,Hibernate,我正在开发一个应用程序,在这个应用程序中,我必须为一个select操作连接3-4个表。 我是带注释的hibernate 3,并在下面添加了我的类结构。然而,我尝试了在连接获取策略中使用许多变体,但未能在2次选择中获得结果。请过目并尽力帮助我。 候选者班 客户类 我只想获取需求类的对象,但是我得到了所有的对象和N+1的查询结果 谢谢你抽出时间 萨钦 @RaulGogo:尝试了条件查询,但问题仍然存在。这些是查询的日志实例。我添加了@BatchSizesize=100,它通过执行批处理获取来减少查询

我正在开发一个应用程序,在这个应用程序中,我必须为一个select操作连接3-4个表。 我是带注释的hibernate 3,并在下面添加了我的类结构。然而,我尝试了在连接获取策略中使用许多变体,但未能在2次选择中获得结果。请过目并尽力帮助我。 候选者班

客户类

我只想获取需求类的对象,但是我得到了所有的对象和N+1的查询结果

谢谢你抽出时间 萨钦

@RaulGogo:尝试了条件查询,但问题仍然存在。这些是查询的日志实例。我添加了@BatchSizesize=100,它通过执行批处理获取来减少查询数量。在注释配置方面,我遗漏了什么

    Hibernate: 
    /* criteria query */ select
    this_.RID as RID3_3_,
    this_.ClientID as ClientID3_3_,
    this_.ReqTitle as ReqTitle3_3_,
    candidates2_.ReqID as ReqID3_5_,
    candidates2_.RID as RID5_,
    candidates2_.RID as RID1_0_,
    candidates2_.ResID as ResID1_0_,
    candidates2_.reqid as reqid1_0_,
    candidates2_.ReqID as ReqID1_0_,
    candidates2_.resid as resid1_0_,
    candidates2_.StatusTitle as StatusTi4_1_0_,
    candidates3_.RID as RID0_1_,
    candidates3_.EmailID as EmailID0_1_,
    candidates3_.FirstName as FirstName0_1_,
    candidates3_.LastName as LastName0_1_,
    candidates3_.Mobile as Mobile0_1_,
    clients4_.RID as RID2_2_,
    clients4_.ClientName as ClientName2_2_ 
from
    HC_REQUISITIONS this_ 
left outer join
    HC_REQ_RESUME candidates2_ 
        on this_.RID=candidates2_.ReqID 
left outer join
    HC_RESUME_BANK candidates3_ 
        on candidates2_.ResID=candidates3_.RID 
left outer join
    HC_CLIENTS clients4_ 
        on this_.ClientID=clients4_.RID 
order by
    this_.ReqTitle asc

  Hibernate: 
  /* load one-to-many com.options.model.Candidates.candidateStats */ select
    candidates0_.ResID as ResID0_3_,
    candidates0_.RID as RID3_,
    candidates0_.RID as RID1_2_,
    candidates0_.ResID as ResID1_2_,
    candidates0_.reqid as reqid1_2_,
    candidates0_.ReqID as ReqID1_2_,
    candidates0_.resid as resid1_2_,
    candidates0_.StatusTitle as StatusTi4_1_2_,
    requiremen1_.RID as RID3_0_,
    requiremen1_.ClientID as ClientID3_0_,
    requiremen1_.ReqTitle as ReqTitle3_0_,
    clients2_.RID as RID2_1_,
    clients2_.ClientName as ClientName2_1_ 
from
    HC_REQ_RESUME candidates0_ 
left outer join
    HC_REQUISITIONS requiremen1_ 
        on candidates0_.ReqID=requiremen1_.RID 
left outer join
    HC_CLIENTS clients2_ 
        on requiremen1_.ClientID=clients2_.RID 
where
    candidates0_.ResID=?
尝试使用标准

return getHibernateTemplate().execute(new HibernateCallback<List<Requirement>>() {
        @Override
        public List<Requirement>doInHibernate(Session session) throws HibernateException, SQLException {
            return (List<Requirement>) session.createCriteria(Requirement.class)
                    .addOrder(Order.asc("reqTitle"))
                    .list();
        }
    });

这将由reqTitle asc从需求订单中选择*,并返回一个需求列表。

谢谢@RaulGogo将此\uuU.ClientID选择为Client3\u 3,将此\uU.reqTitle选择为ReqTitle3\u 3,从HC_申请中,此uu左外部连接HC_u请求u恢复候选2_u在此uu.RID=候选2_id左外部连接HC_u恢复u银行候选3_uu在候选2_u.ResID=候选3_uu.RID左外部连接HC_u客户端4_u在此u.ClientID=客户端4_id。RID order by这是打印的日志查询的一部分。它仍然打印带有连接的N+1查询。字符限制,因此无法发布整个日志。更新了问题以获得答案。请浏览。ThanksAdded.setFetchModeFetchMode.LAZY,但没有更改结果。此外,BatchFetch也有帮助,但它是所有获取策略中最好的解决方案吗?
 @JsonAutoDetect
 @Entity
 @Table(name="HC_CLIENTS")
 public class Clients{

private int id;
private String clientName;
@JsonUnwrapped
private Set<Requirements> require= new HashSet<Requirements>(0);
//private List<Requirements> require;


@OneToMany  //(fetch=FetchType.EAGER)
@Fetch(FetchMode.JOIN)
@JoinColumn(name="ClientID",referencedColumnName="RID")


@JsonIgnore
public Set<Requirements> getRequire() {
    return require;
}
public void setRequire(Set<Requirements> require) {
    this.require = require;
}
@JsonAutoDetect
@Entity

@Table(name="HC_REQUISITIONS")
public class Requirements{

private int id;
private int clientId;
private String reqTitle;
@JsonUnwrapped
private Clients client;

@ManyToOne
@Fetch(FetchMode.JOIN)
@JoinColumn(name="ClientID",insertable=false,updatable=false)
//@JsonIgnore
public Clients getClient() {
    return client;
}
public void setClient(Clients client) {
    this.client = client;
}
    @OneToMany
@Fetch(FetchMode.JOIN)
@JoinColumn(name="ReqID",referencedColumnName="RID")
@JsonIgnore
public Set<CandidateStatus> getCandidateStatus() {
    return candidateStatus;
}
public void setCandidateStatus(Set<CandidateStatus> candidateStatus) {
    this.candidateStatus = candidateStatus;
}
    return hibernateTemplate.find("from Requirements as req order by req.reqTitle");
    Hibernate: 
    /* criteria query */ select
    this_.RID as RID3_3_,
    this_.ClientID as ClientID3_3_,
    this_.ReqTitle as ReqTitle3_3_,
    candidates2_.ReqID as ReqID3_5_,
    candidates2_.RID as RID5_,
    candidates2_.RID as RID1_0_,
    candidates2_.ResID as ResID1_0_,
    candidates2_.reqid as reqid1_0_,
    candidates2_.ReqID as ReqID1_0_,
    candidates2_.resid as resid1_0_,
    candidates2_.StatusTitle as StatusTi4_1_0_,
    candidates3_.RID as RID0_1_,
    candidates3_.EmailID as EmailID0_1_,
    candidates3_.FirstName as FirstName0_1_,
    candidates3_.LastName as LastName0_1_,
    candidates3_.Mobile as Mobile0_1_,
    clients4_.RID as RID2_2_,
    clients4_.ClientName as ClientName2_2_ 
from
    HC_REQUISITIONS this_ 
left outer join
    HC_REQ_RESUME candidates2_ 
        on this_.RID=candidates2_.ReqID 
left outer join
    HC_RESUME_BANK candidates3_ 
        on candidates2_.ResID=candidates3_.RID 
left outer join
    HC_CLIENTS clients4_ 
        on this_.ClientID=clients4_.RID 
order by
    this_.ReqTitle asc

  Hibernate: 
  /* load one-to-many com.options.model.Candidates.candidateStats */ select
    candidates0_.ResID as ResID0_3_,
    candidates0_.RID as RID3_,
    candidates0_.RID as RID1_2_,
    candidates0_.ResID as ResID1_2_,
    candidates0_.reqid as reqid1_2_,
    candidates0_.ReqID as ReqID1_2_,
    candidates0_.resid as resid1_2_,
    candidates0_.StatusTitle as StatusTi4_1_2_,
    requiremen1_.RID as RID3_0_,
    requiremen1_.ClientID as ClientID3_0_,
    requiremen1_.ReqTitle as ReqTitle3_0_,
    clients2_.RID as RID2_1_,
    clients2_.ClientName as ClientName2_1_ 
from
    HC_REQ_RESUME candidates0_ 
left outer join
    HC_REQUISITIONS requiremen1_ 
        on candidates0_.ReqID=requiremen1_.RID 
left outer join
    HC_CLIENTS clients2_ 
        on requiremen1_.ClientID=clients2_.RID 
where
    candidates0_.ResID=?
return getHibernateTemplate().execute(new HibernateCallback<List<Requirement>>() {
        @Override
        public List<Requirement>doInHibernate(Session session) throws HibernateException, SQLException {
            return (List<Requirement>) session.createCriteria(Requirement.class)
                    .addOrder(Order.asc("reqTitle"))
                    .list();
        }
    });