2013-01-12 6 views
5

मैं एक जावा ऐप लिख रहा हूं जो डेटा प्राप्त करने के लिए हाइबरनेट का उपयोग करता है, मेरे ऐप में मेरे पास एक इनपुट टेक्स्ट एरिया है जो उपयोगकर्ता टाइप-इन एसक्यूएल कमांड स्ट्रिंग लेता है और उपयोगकर्ता द्वारा पूछे जाने वाले डेटा को प्राप्त करने के लिए हाइबरनेट के माध्यम से चलाता है, इसलिए मैं पहले से नहीं पता कि परिणाम तालिका कैसी दिख सकती है और इसलिए कॉलम नामों को नहीं पता है, लेकिन मुझे डेटा फ़ील्ड से संबंधित कॉलम नामों के साथ तालिका में उपयोगकर्ता क्वेरी परिणाम प्रदर्शित करने की आवश्यकता है, हाइबरनेट में इसे कैसे प्राप्त किया जाए? मैं निम्नलिखित कोड की कोशिश की है:जावा में हाइबरनेट क्वेरी परिणाम से कॉलम नाम कैसे प्राप्त करें?

Session session=HibernateUtil.getSession(); 
    session.beginTransaction(); 
    Query q=session.createQuery(hql); 

    AliasToEntityMapResultTransformer INSTANCE=new AliasToEntityMapResultTransformer(); 
    q.setResultTransformer(INSTANCE); 
    List<Map<String,Object>> aliasToValueMapList=q.list(); 

    for (Map<String,Object> map : aliasToValueMapList) 
    for (Map.Entry<String,Object> entry : map.entrySet()) System.out.println(entry.getKey()+" - "+entry.getValue()); 

यह मुझे निम्न त्रुटि संदेश दिया: सूत्र "AWT-EventQueue-0" java.lang.ClassCastException में अपवाद: sakila.entity.Actor जावा में ढाला नहीं जा सकता है। use.Map

यह पहली लूप के लिए इंगित कर रहा है, क्योंकि मैं हाइबरनेट के लिए नया हूं, यह नहीं पता कि इसमें क्या करने योग्य है, उपरोक्त कोड को कैसे ठीक किया जाए? क्या कोई मुझे कुछ नमूना कोड दिखा सकता है जो मेरे मामले में काम करता है?

संपादित करें: जैसा कि मार्सेल स्टोर ने नीचे बताया है, मुझे दोनों स्थितियों को होने की अनुमति देने में सक्षम होना चाहिए और किसी भी डेटा से पूछने के लिए उपयोगकर्ताओं की क्षमता को सीमित नहीं करना चाहिए, इसे करने का सबसे अच्छा तरीका क्या है?

उत्तर

1

मैं काफी समझ में नहीं आता, लेकिन अभी भी जवाब देने के लिए हिम्मत ...

आप HQL इस Query q=session.createQuery(hql); की तरह चलता है तुम वापस वस्तुओं और नहीं डिफ़ॉल्ट रूप से अलग-अलग क्षेत्रों मिल का उपयोग करते हैं। इसका मतलब यह है कि आप किसी भी तरह से भाग्य से परिणामों को मैप करने की कोशिश कर रहे भाग्य से बाहर हैं लेकिन आप ऑब्जेक्ट के फील्ड नामों को कॉलम नामों के रूप में उपयोग कर सकते हैं।

यदि टेक्स्ट क्षेत्र से आपको जो मिलता है वह सादा एसक्यूएल है, तो आपको session.createSQLQuery(sql) का उपयोग करना होगा। आप वापस क्या प्राप्त करते हैं list of object arrays है। हालांकि, यहां भी आपको केवल डेटा मिलता है। आपको अपने उपयोगकर्ताओं को select * क्वेरी का उपयोग करने के लिए प्रतिबंधित करना होगा। फिर आप अपने आउटपुट कॉलम नाम के रूप में क्वेरी में फ़ील्ड/कॉलम के नाम का उपयोग कर सकते हैं।

0

क्या उपयोगकर्ता SQL या HQL क्वेरी में टाइप करता है? उन लोगों के बीच एक बड़ा अंतर है।

यदि उपयोगकर्ता एचक्यूएल क्वेरी में टाइप करता है, तो आप hqlQuery.getReturnTypes() पर कॉल कर सकते हैं, और फिर प्रत्येक प्रकार के लिए आप तालिका मेटाडेटा को खोजने के लिए whatever suggested in this post कर सकते हैं।

0

मैं की तरह

select new Map(id as id, name as name) from Person 

कि मैं दृश्य डीटीओ के रूप में उपयोग

एक या अधिक रिकॉर्ड के साथ मैं नक्शा List<Map<String, Object> का तत्व है कि के माध्यम से पुनरावृति कर सकते हैं HQL क्वेरी के लिए समस्या का एक ही तरह मिल गया है । समस्या केवल तभी जब मुझे खाली डेटासेट के साथ स्थिति का प्रबंधन करने की आवश्यकता है। उस मामले के लिए

public List<String> getAliases(String queryString) { 
    ArrayList<String> list = 
     new ArrayList<String>(Arrays.asList(queryString.split("as "))); 
    List<String> result = new ArrayList<String>(); 
    list.remove(0); 
    for (String str : list) { 
     StringTokenizer st = new StringTokenizer(str, ",) "); 
     result.add(st.nextToken()); 
    } 
    return result; 
} 
संबंधित मुद्दे