2010-01-07 11 views
5

जेडीओ के अनुसार, आप PersistenceManager.getObjectsById का उपयोग अपने ऑब्जेक्ट आईडी द्वारा एकाधिक इकाई उदाहरणों को लोड करने के लिए कर सकते हैं।ऐप इंजन पर getObjectsById

किस प्रकार के संग्रह को यहां उपयोग करने की आवश्यकता है? एक Google डेटा स्टोर कुंजी ऑब्जेक्ट आईडी के रूप में काम नहीं करता है।

उत्तर

2

नहीं एक सीधा जवाब है, द्वारा getObjectsById के लिए एक विकल्प के रूप में, ऐसा लगता है कि आप उपयोग कर सकते हैं एक JDOQL query to load multiple entities by key:

public List getById(List keys) { 
    Query q = pm.newQuery(
     "select from " + Book.class.getName() + " where :keys.contains(key)"); 
    return (List) q.execute(keys); 
} 

जाहिर है, इस प्रश्न के लिए एक कुशल निम्न स्तर के थोक एपीआई का उपयोग करने के लिए अनुकूलित किया गया है।

हालांकि चाबियों का क्रम खो जाता है, इसलिए आपको परिणामस्वरूप जावा भूमि में फिर से क्रमबद्ध करना होगा।

+0

मैं यह काम कर नहीं पा रहा हूँ: असमर्थित विधि अभिव्यक्ति पार्स करते समय:। InvokeExpression {[ParameterExpression {कुंजी}] शामिल हैं (VariableExpression क्वेरी के साथ समस्या <: keys.contains (key) बुक कहां से चुनें> {key})} –

3

उपयोग PersistenceManager.newObjectIdInstance(), के रूप में इस तरह के

List<Object> ids = new ArrayList<Object>(); 
for (Key key : keys) { 
    ids.add(pm.newObjectIdInstance(Foo.class, key)); 
} 

return (List<Foo>) pm.getObjectsById(ids); 

मुझे यकीन है कि फिर भी कैसे महंगा newObjectIdInstance करने के लिए कॉल (यह मैं क्या देख सकते हैं से नहीं होना चाहिए) है नहीं कर रहा हूँ।

+0

यह बहुत महंगा है! – Sam

+0

@ सैम, आप किस विकल्प की तुलना कर रहे हैं? क्या यह थिलो के समाधान से अधिक महंगा है? आप कैसे मूल्यांकन कर रहे हैं कि यह कॉल कितना महंगा है? – Price

0

मेरे ऊपर का जवाब लगभग सही है।

Google द्वारा डेवलपर वेबसाइट पर समझाए गए वाक्यविन्यास में एक गलती प्रतीत होती है।

गूगल द्वारा बताई गई है:

// मुझे स्मिथ या जोन्स क्वेरी क्वेरी = pm.newQuery को lastName बराबर के साथ सभी कर्मचारियों को दे दो (Employee.class, ": p.contains (lastName)") ; query.execute (Arrays.asList ("स्मिथ", "जोन्स"));

निश्चित रूप से यह होना चाहिए:

// मुझे स्मिथ या जोन्स क्वेरी क्वेरी = pm.newQuery (Employee.class, "p.contains (करने के लिए lastName बराबर के साथ सभी कर्मचारियों को दें: lastName) "); query.execute (Arrays.asList ("स्मिथ", "जोन्स"));

+0

डॉक्टर सही है। ": पी" आपकी सूची है, और आप उन वस्तुओं की जांच कर रहे हैं जिनकी "अंतिम नाम" आपकी सूची में निहित है, इसलिए । (ऑब्जेक्ट का अंतिम नाम मूल्य>) शामिल है। – opowell