java - 具有多个连接的 JPA 条件生成器

标签 java join jpa-2.0 criteria-api

我正在努力创建一个使用多个表的 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 运算符。我无法在网上找到足够的关于加入的信息来提供帮助。一旦我尝试加入超过一张 table 的深度,我就会卡住。一些建议或技巧真的很有用。 谢谢

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

最佳答案

JPA 查询中的连接是这样的:

创建从 A 到 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 的引用,就可以将其用于路径变量。

关于java - 具有多个连接的 JPA 条件生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3870944/

相关文章:

java - 如何在 JPA/Hibernate 应用程序中配置连接池(没有 Spring)?

java - Android 是否包含类似于 java.awt.geom 的库?

java - 为什么我的属性转换为pojo后无法识别

mysql - SQL 使用 JOIN 查询多个表 - Northwind

mysql - 简单的 mysql 连接无法正常工作

mysql - 实现 Mysql 连接。如何获得同一行的结果?

postgresql - 通过 jpa2 在 postgresql 中使用 month() 函数和 year() 函数

java - 为什么在java中尝试将大写字母转换为小写字母时末尾会出现额外的空格,反之亦然

java - 模块可以与父模块具有相同的artifactID吗? |梅文

java - JPA/Metamodel : Strange (inconsistent ? ) Sun Docs 中的示例