标准JPA 2有3个表

我正在尝试创建一个标准来从3个表中检索一些对象(关联,更新和详细信息)。 详细信息引用了“关联”和“更新”,“更新”引用了“详细信息”列表。 我的目标是在给定Associate id的情况下检索在指定字段中至少具有null值的Detail的更新列表。 在JPQL中很容易做到,但客户说这必须用标准编码。

我的JPQL是:

public List getUpdates(long associateId) { TypedQuery query = em.createQuery("select distinct u from Update u, Detail dt, Associate a " + "where dt.update = u and dt.associate = a and a.associateId = :id and " + "dt.ack_date is null", Update.class); query.setParameter("id", associateId); return query.getResultList(); } 

我尝试了以下内容,但它只返回了数据库中的所有更新:

 public List getUpdates(long associateId) { CriteriaBuilder builder = em.getCriteriaBuilder(); CriteriaQuery query = builder.createQuery(Update.class); Root fromUpdates = query.from(Update.class); Root fromAssociate = query.from(Associate.class); Root fromDetail = query.from(Detail.class); Join associateJoin = fromDetail.join("associate"); Join updateJoin = fromDetail.join("update"); TypedQuery typedQuery = em.createQuery(query .select(fromUpdates) .where(builder.and( builder.equal(fromAssociate.get("associateId"), associateId), builder.equal(fromDetail.get("associate"), associateJoin), builder.equal(fromDetail.get("update"), updateJoin), builder.isNull(fromDetail.get("ack_date")) )) .orderBy(builder.asc(fromUpdates.get("updateId"))) .distinct(true) ); return typedQuery.getResultList(); } 

谁能帮我? 我搜索但找不到3个实体的任何例子。

每个连接都会将您从左侧类型参数带到右侧类型参数。 因此,我的代码(第二行)的details连接从fromUpdates开始,即Path ,并在幕后创建一个Path 。 从那以后,您可以构建其他联接。 试试这个(代码未测试):

 Root fromUpdates = query.from(Update.class); Join details = fromUpdates.join("details"); Join associate = details.join("associate"); List conditions = new ArrayList(); conditions.add(builder.equal(associate.get("associateId"), associateId)); conditions.add(builder.isNull(details.get("ack_date"))); TypedQuery typedQuery = em.createQuery(query .select(fromUpdates) .where(conditions.toArray(new Predicate[] {})) .orderBy(builder.asc(fromUpdates.get("updateId"))) .distinct(true) ); 

涉及三个表。

CriteriaBuilder builder = theEntityManager.getCriteriaBuilder(); CriteriaQuery query1 = builder.createQuery(BasicMemberInfo.class);

  Root table1 = query1.from(Table1.class); Root table2 = query1.from(Table2.class); Root table3 = query1.from(Table3.class); List conditions = new ArrayList(); conditions.add(builder.equal(table3.get("Table1").get("memberId"), table1.get("memberId"))); conditions.add(builder.equal(table2.get("tableid").get("memberId"), table1.get("memberId"))); conditions.add(builder.equal(table2.get("indicator"), 'Y')); conditions.add(builder.equal(table3.get("StatusCd"), "YES")); TypedQuery typedQuery = theEntityManager.createQuery( query1.multiselect(table1.get("memberId"), table2.get("AcctId")) .where(conditions.toArray(new Predicate[] {})) ); List custList = typedQuery.getResultList(); 

公共类BasicMemberInfo {

 String memberId; String AcctId; public BasicCustInfo() { // TODO Auto-generated constructor stub } public BasicMemberInfo( BigDecimal memberId,String AcctId ) { this.memberId = memberId; this.AcctId = AcctId; } public BigDecimal getmemberId() { return memberId; } public void setmemberId(BigDecimal memberId) { memberId = memberId; } public String getAcctId() { return AcctId; } public void setAcctId(String AcctId) { AcctId = AcctId; } 

}