5

वर्ग Operation, और इसके 3 उपवर्गों पर विचार करें:उर्फ ​​

class Operation {} 
class OpA extends Operation { } 
class OpB extends Operation { Account account; } 
class OpC extends Operation { Account account; } 

केवल OpB और OpC एक क्षेत्र account कहा जाता है।

मैं account संपत्ति के लिए क्वेरी करना चाहते हैं:

session.createCriteria(Operation.class) 
     .add(Restrictions.eq("account", account)) 
     .list(); 

यह काम करता है। हाइबरनेट इस तथ्य को अनदेखा करता है कि Operation और OpA दोनों में account नामक कोई फ़ील्ड नहीं है, और OpB और OpC के लिए सही परिणाम देता है।

हालांकि, अब भी मैं खाता स्वामी के लिए पूछताछ करना चाहता हूं, और इसके द्वारा आदेश देना चाहता हूं। मैं तो account के लिए उर्फ ​​_account बनाएँ:

session.createCriteria(Operation.class) 
     .add(Restrictions.eq("account", account)) 
     .createAlias("account", "_account") 
     .add(Restrictions.eq("_account.owner", "John")) 
     .addOrder(Order.asc("_account.owner")) 
     .list(); 

यह विफल रहता है। इसलिए हाइबरनेट शिकायत वहाँ, (OpB और OpC से) खाते के लिए 2 अलग तालिकाएँ हैं:

Not unique table/alias: 'account1_' 

मेरा प्रश्न: मैं दोनों खाते और खाते के मालिक के लिए कैसे क्वेरी कर सकता है, केवल Criteria (कोई एसक्यूएल का उपयोग कर, एचक्यूएल) सबसे आसान संभव तरीके से?

+0

क्या होगा की तरह वांछित एसक्यूएल देखो? –

+0

@ पेड्रैग: क्षमा करें, मुझे कोई जानकारी नहीं है। – MarcG

उत्तर

3

यह मेरा समाधान है। यह केवल आंशिक रूप से काम करता है: .addOrder(Order.asc("_account.owner")):

Criterion subQ1 = Subqueries.propertyIn("id", 
         DetachedCriteria.forClass(OpB.class) 
          .add(Restrictions.eq("account", account)) 
          .createAlias("account", "_account") 
          .add(Restrictions.eq("_account.owner", "John")) 
          .setProjection(Projections.groupProperty("id"))); 

Criterion subQ2 = Subqueries.propertyIn("id", 
         DetachedCriteria.forClass(OpC.class) 
          .add(Restrictions.eq("account", account)) 
          .createAlias("account", "_account") 
          .add(Restrictions.eq("_account.owner", "John")) 
          .setProjection(Projections.groupProperty("id"))); 

session.createCriteria(Operacao.class) 
     .add(Restrictions.disjunction() 
      .add(subQ1) 
      .add(subQ2)) 
     .list(); 

यह रूप में लंबे समय के रूप में मैं आदेश नहीं जोड़ते हैं काम करता है।

आदेश Subqueries में जोड़ा नहीं जा सकता है, क्योंकि इसका कोई प्रभाव नहीं पड़ेगा। और इसे Criteria में जोड़ा नहीं जा सकता है, क्योंकि यह उपनाम स्वीकार नहीं करता है।

शायद इसे ट्विक करने का कोई तरीका है, या शायद यह समाधान बहुत जटिल है और एक आसान है?

3

नीचे दिए गए दो समाधान काम नहीं करते हैं। दोनों परिणाम Not unique table/alias: 'account1_' में परिणाम।

session.createCriteria(Operacao.class) 
     .add(Restrictions.eq("account", account)) 
     .createCriteria("account") 
     .add(Restrictions.eq("owner", "John")) 
     .list(); 
1

प्रयास करें:

session.createCriteria(Operation.class) 
     .createAlias("account", "_account") 
     .add(
      Restrictions.and(
       Restrictions.or(
        Property.forName("class").eq(OpB.class), 
        Property.forName("class").eq(OpC.class)), 
       Restrictions.eq("account", account) 
       Restrictions.eq("_account.owner", "John")) 
       ) 
      ) 
     .list(); 
उर्फ ​​बिना

:

मैं उन्हें यहाँ दस्तावेज़ के लिए सवाल ही उलझी बिना काम क्या नहीं है, या हो सकता है, किसी और को देने के लिए विचारों पोस्टिंग कर रहा हूँ

public abstract class AccountOperation extends Operation { 
    public abstract Account getAccount();  
} 
अब

दोनों: के रूप में एक AccountOperation सार वर्ग को जोड़ने के लिएऔर OpCAccountOperation का विस्तार होगा।

आपकी क्वेरी हो जाएगा:

Criteria c = session.createCriteria(AccountOperation.class, "op") 
    .createAlias("op.account", "ac") 
    .add(Restrictions.eq("ac", account)) 
    .addOrder(Order.asc("ac.owner")) 
    .list(); 
+0

हां, मेरा उदाहरण अनावश्यक है, लेकिन यह सिर्फ एक उदाहरण है। मेरी समस्या 'अद्वितीय तालिका/उपनाम नहीं है:' account1_' 'अपवाद। – MarcG

+0

क्षमा करें Vlad, मैं कार्यालय से बाहर था और इससे पहले परीक्षण नहीं कर सका। खैर, आपका उदाहरण मुझे यह अपवाद देता है: 'अद्वितीय तालिका/उपनाम नहीं:' ac1_''। – MarcG

+0

निर्देश के साथ मुझे 'java.lang.Class को java.lang.Integer' पर' org.hibernate.type.descriptor.java.IntegerTypeDescriptor.unwrap' पर नहीं डाला जा सकता है। – MarcG

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