2010-10-06 56 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中,您可以将其用于路径变量。