0

選択操作のために 3 ~ 4 個のテーブルを結合する必要があるアプリケーションに取り組んでいます。私は注釈付きで 3 を休止状態にし、クラス構造を以下に追加しました。ただし、結合フェッチ戦略で多くのバリエーションを使用しようとしましたが、2 つの選択で結果を取得できませんでした。通り抜けて、私を助けてみてください。 受験者クラス

@JsonAutoDetect
@Entity
@Table(name="HC_RESUME_BANK")
public class Candidates{

private int id;
private String firstName;
private String lastName;
private String email;
private String phone;
@JsonUnwrapped  
private Set<CandidateStatus> candidateStats = new HashSet<CandidateStatus>(0);

@OneToMany  //(mappedBy="candidate")
@Fetch(FetchMode.JOIN)
@JoinColumn(name="ResID",nullable=false,referencedColumnName="RID")
@JsonIgnore
public Set<CandidateStatus> getCandidateStats() {
        return candidateStats;
}
public void setCandidateStats(Set<CandidateStatus> candidateStats) {
    this.candidateStats = candidateStats;
}

CandidateStatus クラス

@JsonAutoDetect
@Entity

@Table(name="HC_REQ_RESUME")

public class CandidateStatus{

private int id;
private String statusTitle;
@JsonUnwrapped
private Candidates candidate;
private int reqid;
private int resid;

@JsonUnwrapped
private Requirements requirement;

@ManyToOne
@Fetch(FetchMode.JOIN)

@JoinColumn(name="ReqID",insertable=false,updatable=false)
//@JsonIgnore
public Requirements getRequirement() {
    return requirement;
}
    @ManyToOne //(fetch =    FetchType.LAZY,cascade=CascadeType.ALL,targetEntity=Candidates.class)
@Fetch(FetchMode.JOIN)
@JoinColumn(name="ResID",insertable=false,updatable=false)
//@ForeignKey(name = "FK_ResID")

public Candidates getCandidate() {
    return candidate;
}

public void setCandidate(Candidates candidate) {
    this.candidate = candidate;
}

クライアントクラス

 @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;
}

不必要なコードを避けるために、Getter/Setterメソッドを削除しました。
N+1 が発生するため、上記のクラスの関連付けで何が問題になっていますか? クエリは次のとおりです。

    return hibernateTemplate.find("from Requirements as req order by req.reqTitle");

Requirement クラスのオブジェクトのみを取得したいのですが、すべてのオブジェクトとクエリの N+1 の結果を取得します

お時間をいただきありがとうござい
ます

@RaulGogo: 条件クエリを試しましたが、問題は解決しません。これらはクエリのログ インスタンスです。また、@ BatchSize(size=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=?
4

1 に答える 1

0

基準を使用してみてください。

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();
        }
    });

これはselect * from Requirement order by reqTitle ascを実行し、要件のリストを返します。

于 2012-04-10T14:32:26.330 に答える