2010-10-06 57 views
1

我正在努力創建一個使用多個表的jpa查詢。我似乎無法理解如何將表格連接在一起。這是我試圖創建的查詢:帶有多個連接的JPA條件生成器

SELECT algm.m_l_i, algnsm.n_s_i 
    FROM algm, alg, algnsm, mal 
WHERE algm.l_g_i = alg.l_g_i 
    AND alg.l_g_t = 'xxx' 
    AND algnsm.l_g_i = algm.l_g_i 
    AND mal.c_l_i = algm.m_l_i 
    AND mal.p_l_i = 'yyy'; 

我已經嘗試了幾種方法,從使用連接運算符到在鍵上使用where運算符。我無法在網上找到足夠的信息來幫助您。一旦我嘗試加入超過1張表格,我就會卡住。一些建議或提示將非常有用。 感謝

CriteriaBuilder b = em.getCriteriaBuilder(); 
CriteriaQuery<Tuple> q = builder.createTupleQuery(); 
Root<MAL> malRoot = query.from(MAL.class); 
Root<ALGM> algmRoot = query.from(ALGM.class); 

// error 
algmRoot.join(ML_.mLI); 
// error 
malRoot.join(ML_.mLI); 

Predicate e1 = builder.equal(malRoot.get(MAL_.pL).get(ML_.mLI), "abc"); 
Predicate e2 = builder.equal(malRoot.get(MAL_.cL), algmRoot.get(ALGM_.mL)); 

query.where(builder.and(e1, e2)); 

query.select(builder.tuple(malRoot.get(MAL_.pL), malRoot.get(MAL_.cL), algmRoot.get(ALGM_.aLG).get(ALG_.lGT))); 

@Entity 
@Table(name = "M_A_L") 
public class MAL implements Serializable { 
    @EmbeddedId 
    protected MALPK malPK; 

    @Basic(optional = false) 
    @Column(name = "ENTRY_IND") 
    private String entryInd; 

    @JoinColumn(name = "P_L_I", referencedColumnName = "M_L_I", insertable = false, updatable = false) 
    @ManyToOne(optional = false) 
    private ML pL; 

    @JoinColumn(name = "C_L_I", referencedColumnName = "M_L_I", insertable = false, updatable = false) 
    @ManyToOne(optional = false) 
    private ML cL; 
... 
} 

@Entity 
@Table(name = "A_L_G_M") 
public class ALGM implements Serializable { 

    @EmbeddedId 
    protected ALGMPK algmPK; 

    @JoinColumn(name = "M_L_I", referencedColumnName = "M_L_I", insertable = false, updatable = false) 
    @ManyToOne(optional = false, fetch = FetchType.EAGER) 
    private ML mL; 

    @JoinColumn(name = "L_G_I", referencedColumnName = "L_G_I", insertable = false, updatable = false) 
    @ManyToOne(optional = false) 
    private ALG aLG; 
.... 
} 

public class ALGM_ { 
    public static volatile SingularAttribute<ALGM, ML> mL; 
    public static volatile SingularAttribute<ALGM, ALGMPK> aLGMPK; 
    public static volatile SingularAttribute<ALGM, ALG> aLG; 
} 

public class MAL_ { 
    public static volatile SingularAttribute<MAL, String> eI; 
    public static volatile SingularAttribute<MAL, MALPK> mALPK; 
    public static volatile SingularAttribute<MAL, ML> pL; 
    public static volatile SingularAttribute<MAL, ML> cL; 
} 

public class ALG_ { 
    public static volatile CollectionAttribute<ALG, MW> mWC; 
    public static volatile SingularAttribute<ALG, ALGCM> aLGCM; 
    public static volatile SingularAttribute<ALG, ALGAVM> aLGAVM; 
    public static volatile SingularAttribute<ALG, TR> tZ; 
    public static volatile CollectionAttribute<ALG, ALGM> aLGMC; 
    public static volatile SingularAttribute<ALG, String> d; 
    public static volatile SingularAttribute<ALG, String> lGT; 
    public static volatile SingularAttribute<ALG, String> lGI; 
    public static volatile SingularAttribute<ALG, ALGNSM> aLGNSM; 
    public static volatile SingularAttribute<ALG, ALGFVM> aLGFVM; 
    public static volatile SingularAttribute<ALG, ALGNAM> aLGNAM; 
} 
+0

您能找到解決方案嗎?如果是這樣,你可以在這裏發佈嗎?謝謝 – Ittai 2011-03-28 16:29:48

+1

@Ittai對不起,我從來沒有完全工作。最後我使用了另一種技術:-( – 2011-04-08 11:27:01

回答

1

聯接在JPA查詢是這樣的:

若要從一個連接到B:

Root<A> root .... 
CriteriaQuery<?> query ..... 
CriteriaBuilder builder..... 

Join<A, B> BTable = root.join(SingularAttribute<A, B>); 

Join<A, B> BTable = root.join(A_.B); 

一旦你有裁判到bTable中,您可以將其用於路徑變量。