2013-06-17 7 views
12

के साथ मानदंड जेपीए 2 मैं 3 टेबल (एसोसिएट, अपडेट और विवरण) से कुछ ऑब्जेक्ट्स को पुनर्प्राप्त करने के लिए मानदंड बनाने की कोशिश कर रहा हूं। एक विवरण में एसोसिएट और अपडेट का संदर्भ है, और एक अद्यतन में विवरण की एक सूची का संदर्भ है। मेरा उद्देश्य उन अद्यतनों की एक सूची पुनर्प्राप्त करना है जिनमें एक निर्दिष्ट फ़ील्ड में कम से कम एक विवरण है, जो एक एसोसिएट आईडी दिया गया है। जेपीक्यूएल में करना आसान था लेकिन क्लाइंट ने कहा कि इसे मानदंडों के साथ कोड किया जाना चाहिए।3 टेबल

मेरे JPQL था:

public List<Update> getUpdates(long associateId) { 
    TypedQuery<Update> 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<Update> getUpdates(long associateId) { 
    CriteriaBuilder builder = em.getCriteriaBuilder(); 
    CriteriaQuery<Update> query = builder.createQuery(Update.class); 

    Root<Update> fromUpdates = query.from(Update.class); 
    Root<Associate> fromAssociate = query.from(Associate.class); 
    Root<Detail> fromDetail = query.from(Detail.class); 

    Join<Detail, Associate> associateJoin = fromDetail.join("associate"); 
    Join<Detail, Update> updateJoin = fromDetail.join("update"); 

    TypedQuery<Update> 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 इकाइयों के साथ कोई उदाहरण नहीं मिला।

उत्तर

22

प्रत्येक जॉइन आपको बाएंश प्रकार पैरामीटर से दाएं को ले जाता है। इसलिए, details मेरे कोड (दूसरी पंक्ति) में शामिल होने से fromUpdates से शुरू होता है, जो Path<Update> है, और दृश्यों के पीछे कुछ भी बनाता है जो Path<Detail> भी है। उस से, आप अन्य जोड़ों का निर्माण कर सकते हैं।

Root<Update> fromUpdates = query.from(Update.class); 
Join<Update, Detail> details = fromUpdates.join("details"); 
Join<Detail, Associate> associate = details.join("associate"); 
List<Predicate> conditions = new ArrayList(); 
conditions.add(builder.equal(associate.get("associateId"), associateId)); 
conditions.add(builder.isNull(details.get("ack_date"))); 

TypedQuery<Update> typedQuery = em.createQuery(query 
     .select(fromUpdates) 
     .where(conditions.toArray(new Predicate[] {})) 
     .orderBy(builder.asc(fromUpdates.get("updateId"))) 
     .distinct(true) 
); 
+3

एक आकर्षण की तरह काम किया! इन मानदंडों में शामिल होने से मुझे पागल बना दिया गया, लेकिन इससे बहुत मदद मिली! धन्यवाद perissf :) –

1

तीन शामिल तालिकाओं के लिए: यह (नहीं परीक्षण किया कोड) की कोशिश करो।

मानदंड बिल्डर निर्माता = theEntityManager.getCriteriabuilder(); मानदंड क्वेरी 1 = builder.createQuery (BasicMemberInfo.class);

Root<Table1> table1 = query1.from(Table1.class); 
    Root<Table2> table2 = query1.from(Table2.class); 
    Root<Table3> table3 = query1.from(Table3.class); 

    List<Predicate> 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<BasicCustInfo> typedQuery = theEntityManager.createQuery(
      query1.multiselect(table1.get("memberId"), table2.get("AcctId")) 
      .where(conditions.toArray(new Predicate[] {})) 
    ); 

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

}

संबंधित मुद्दे