2012-12-13 48 views
9

मेरे पास टेबल 1, टेबल 2 के रूप में नामित दो टेबल हैं। दोनों टेबलों में फ़ील्ड के समान नहीं हैं। इन दो तालिकाओं के बीच कोई संबंध नहीं है। मेरी आवश्यकता है कि मैं सभी रिकॉर्ड चाहता हूं तालिका 1 में जो तालिका 2 में नहीं हैं। तो मैंने मानदंड एपीआई का उपयोग कर एक प्रश्न लिखा है। लेकिन यह सही परिणाम नहीं दे रहा है। चूंकि मैं इस जेपीए और मानदंड एपीआई में नया हूं, क्या कोई मुझे बता सकता है कि मैं गलत कहां कर रहा हूं। नीचे कोड मैं इसे करने के लिए उपयोग कर रहा हूं।जेपीए मानदंडों में EXISTS का उपयोग करके कोई प्रश्न नहीं बना रहा है

CriteriaBuilder cb = mediationEntityManager.getCriteriaBuilder(); 
CriteriaQuery<Table1> cq = cb.createQuery(Table1.class); 
Root<Table1> table1 = cq.from(Table1.class); 
cq.select(table1) 

Subquery<Table2> subquery = cq.subquery(Table2.class) 
Root table2 = subquery.from(Table2.class) 
subquery.select(table2) 
cq.where(cb.not(cb.exists(subquery))) 
TypedQuery<Table1> typedQuery = mediationEntityManager.createQuery(cq); 
List<Table1> resultList = typedQuery.getResultList(); 

MySQL क्वेरी:

SELECT table1 
FROM table1 table1 
WHERE NOT EXISTS (SELECT table2 
        FROM table2 table2 
        WHERE table2.name = table1.name 
          AND table2.education = table1.education 
          AND table2.age = table1.age) 
     AND table1.name = 'san' 
     AND table1.age = '10'; 

मैं उपर्युक्त MySQL क्वेरी के लिए जेपीए मापदंड API क्वेरी की जरूरत है।

+0

लेकिन आप इन तालिकाओं के बीच डेटा फर्क कर रहे हैं कैसे, निर्दिष्ट मापदंड/स्तंभ आदि –

+0

हाय बहुत जबाब मैं अपने मूल में वास्तविक mysql क्वेरी दे रहा हूँ Question.Plz इसे में और यदि संभव हो तो दे देखने के लिए देने के लिए धन्यवाद मुझे एक ही mysql क्वेरी के लिए jpa मानदंड api क्वेरी। – aaaa

उत्तर

12

आप निम्न कोड को मानदंड API के साथ आज़मा सकते हैं। मैंने कोशिश नहीं की है, लेकिन आप तदनुसार कोड को संशोधित करने का प्रयास कर सकते हैं।

CriteriaBuilder cb = mediationEntityManager.getCriteriaBuilder(); 
CriteriaQuery<Table1> query = cb.createQuery(Table1.class); 
Root<Table1> table1 = query.from(Table1.class); 
query.select(table1); 
//-- 
Subquery<Table2> subquery = query.subquery(Table2.class); 
Root<Table2> table2 = subquery.from(Table2.class); 
subquery.select(table2); 
//-- 
List<Predicate> subQueryPredicates = new ArrayList<Predicate>(); 
subQueryPredicates.add(cb.equal(table1.get(Table1_.name), table2.get(Table2_.name))); 
subQueryPredicates.add(cb.equal(table1.get(Table1_.age), table2.get(Table2_.age))); 
subQueryPredicates.add(cb.equal(table1.get(Table1_.education), table2.get(Table2_.education))); 
subquery.where(subQueryPredicates.toArray(new Predicate[]{})); 
//-- 
List<Predicate> mainQueryPredicates = new ArrayList<Predicate>(); 
mainQueryPredicates.add(cb.equal(table1.get(Table1_.name), "san"); 
mainQueryPredicates.add(cb.equal(table1.get(Table1_.age), "10"); 
mainQueryPredicates.add(cb.not(cb.exists(subquery))); 
//-- 
query.where(mainQueryPredicates.toArray(new Predicate[]{})); 
TypedQuery<Table1> typedQuery = mediationEntityManager.createQuery(query); 
List<Table1> resultList = typedQuery.getResultList(); 

इसके अलावा, आप JPQL क्वेरी के नीचे की कोशिश कर सकते, जो और अधिक आसान है, समझ & डिबग को बदलने के लिए है।

SELECT t1 
FROM table1 t1, 
     table2 t2 
WHERE t1.name = 'san' 
     AND t1.age = '10' 
     AND (t2.name <> t1.name 
      AND t2.education <> t1.education 
      AND t2.age <> t1.age); 
+0

अरे बहुत बहुत धन्यवाद ... यह ठीक काम कर रहा है। – aaaa

+0

@aaaa आपका स्वागत है और आपने किस दृष्टिकोण को –

+0

पसंद किया है, मैंने मापदंड एपीआई बोक्ज़ को प्राथमिकता दी है जो मेरी आवश्यकता है। – aaaa