2012-07-26 15 views
7

Android के लिए ORMLite का उपयोग करके, मुझे एक क्वेरी बनाने की आवश्यकता है जो ऑर्डर आईडी या ग्राहक नाम द्वारा ऑर्डर देता है। कृपया निम्नलिखित वर्ग घोषणाओं पर विचार करें:ORMLite - क्वेरी विदेशी क्षेत्र

SELECT 
    o.* 
FROM 
    order o 
    JOIN customer c on 
     o.customer_id = c.id 
WHERE 
    (o.id = ?) OR (c.name = ?) 

ORMLite का उपयोग कर यह करने के लिए सबसे अच्छा तरीका क्या है:

@DatabaseTable(tableName = "order") 
public class Order { 
    @DatabaseField(generatedId = true) 
    private Long id; 

    @DatabaseField(foreign = true, canBeNull = false, foreignAutoRefresh = true, columnName = "customer_id") 
    private Customer customer; 

    // default constructor, getters and setters... 
} 

@DatabaseTable(tableName = "customer") 
public class Customer { 
    @DatabaseField(generatedId = true) 
    private Long id; 

    @DatabaseField 
    private String name; 

    // default constructor, getters and setters... 
} 

कच्चे एसक्यूएल मैं तलाश कर रहा हूँ कुछ इस तरह हो सकता है?

+0

http://stackoverflow.com/questions/17618198/error-in-query-with-join-with-ormlite कृपया, मेरी मदद करो: (@Gray – fabiodresch

उत्तर

12

ORMLite अब simple join queries का समर्थन करता है एक सपना दे देंगे।

तो आपकी क्वेरी कुछ ऐसा दिखाई देगा:

QueryBuilder<Customer, Integer> customerQb = customerDao.queryBuilder(); 
SelectArg nameSelectArg = new SelectArg(); 
// this gives the c.name = ? 
customerQb.where().eq("name", nameSelectArg); 
QueryBuilder<Account, Integer> orderQb = orderDao.queryBuilder(); 
SelectArg idSelectArg = new SelectArg(); 
// this gives the o.id = ? 
orderQb.where().eq("id", idSelectArg); 
orderQb.join(customerQb); 
// then you set the args and run the query 
nameSelectArg.setValue("jim"); 
idSelectArg.setValue(1); 
List<Order> results = orderQb.join(customerQb).query(); 
+0

ग्रे, हमने एंड्रॉइड पर ऑर्मेलाइट को संभावित ओआरएम के रूप में देखा, और देखा कि संबंधों को जोड़ने के बजाय अलग-अलग प्रश्नों के माध्यम से लोड किया जाता है, इस प्रकार एन + 1 समस्या से पीड़ित होता है। इस तरह इसे लागू करने के पीछे तर्क क्या था? वर्तमान में इसका मतलब है कि 100 'ए' पर 'queryForAll'' प्रत्येक के पास 'बी' एक के बजाय 101 प्रश्न जारी करेगा। सभी 'ए' लाने के लिए 1 प्रश्न, फिर प्रत्येक 'ए' के ​​लिए 'बी' लाने के लिए एक और 100 प्रश्न। – Matthias

+0

संक्षिप्त उत्तर यह है क्योंकि यह ORMHeavy @Matthias नहीं है। मुझे कुछ लोग इसके कोड आकार और इसकी कुछ गायब सुविधाओं के बारे में शिकायत करते हैं ... – Gray

+0

ठीक है पर्याप्त मेला। मुझे लगता है कि यह एक अजीब चूक है हालांकि कई अन्य विशेषताएं हैं। यह एक आम विरोधी पैटर्न है और - मुझे लगता है कि - अपने स्वयं के उद्देश्य को हरा देता है क्योंकि क्लाइंट को मैपिंग करने की आवश्यकता होती है जब तक कि वे इसकी अतिरिक्त लागत को निगलना नहीं चाहते (जो बड़ा है और टेबल आकार के साथ बढ़ता है) – Matthias

0

नहीं है, ORMLite https://stackoverflow.com/a/7320091/323128 में समर्थित हैं मिलती है हालांकि, this reference अपने कार्य को पूरा करने के लिए कैसे

+0

मैं उस मामले में कच्चे प्रश्नों के साथ काम करने में ठीक हूं। क्या कच्चे प्रश्न से सूची प्राप्त करना संभव है? या क्या मैं जेनेरिकरॉर्सेल्ट्स के साथ काम कर सकता हूं? – itmartins

+0

डीओसी: queryRaw विधियां जेनेरिकराउआरसल्ट ऑब्जेक्ट को वापस करती हैं जो एक का प्रतिनिधित्व करती है परिणाम स्ट्रिंग्स, ऑब्जेक्ट्स की सरणी, या उपयोगकर्ता मैप किए गए ऑब्जेक्ट्स के सरणी के रूप में परिणाम। - तो आप एक रचना ऑब्जेक्ट बना सकते हैं जिसे आप किसी परिणाम में डेटा प्राप्त करने के लिए अपने परिणाम पर मैप करेंगे कंटेनर के बेहतर तो तारों की सरणी – Maxim

+0

धन्यवाद मैक्सिम, आप बहुत उपयोगी रहे हैं। हालांकि, मेरे वास्तविक ऑर्डर क्लास में 20+ विशेषताएं हैं, जो ऑर्डर ऑब्जेक्ट प्राप्त करने के लिए प्रत्येक विशेषता को मैप करने के लिए बहुत श्रमिक बनाती हैं। – itmartins

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