2013-03-14 7 views
7

में सामान्य क्वेरी के बजाय टाइपेडक्वियर क्या यह प्रश्न टाइप किए गए टाइप के रूप में लिखना संभव है और दो लांग को ऑब्जेक्ट में दो सार्वजनिक लांग फ़ील्ड के अंदर चलाने दें।जेपीए

Query q = em.createQuery(
      "SELECT c.id, COUNT(t.id) " + 
      "FROM PubText t " + 
      "JOIN t.comm c " + 
      "WHERE c.element = ?1 " + 
      "GROUP BY c.id"); 
    q.setParameter(1, e); 
    List<?> rl = q.getResultList(); 
    Iterator<?> it = rl.iterator(); 
    HashMap<Long, Long> res = new HashMap<Long, Long>(); 
    while (it.hasNext()) { 
     Object[] n = (Object[]) it.next(); 
     res.put((Long)n[0], (Long)n[1]); 
    } 
    return res; 

उत्तर

12

जेपीए सिर्फ इस के लिए एक सुविधा है - निर्माता भाव:

Query q = entityManager.createQuery("SELECT NEW com.example.DTO(c.id, COUNT(t.id)) FROM ..."); 
List<DTO> dtos = q.getResultList(); 

आपका डीटीओ वर्ग एक POJO हो सकता है। इसकी आवश्यकता होगी एक सार्वजनिक कन्स्ट्रक्टर 2 Long एस स्वीकार कर रहा है। कृपया ध्यान दें कि NEW ऑपरेटर के बाद आपको अपनी कक्षा का पूर्णतः योग्य नाम प्रदान करना होगा।

+0

हाय @ कोस्टजा मुझे एक त्रुटि मिल रही है (एक से अधिक रिटर्न के साथ क्वेरी के लिए TypedQuery नहीं बना सकता)। मेरा एसक्यूएल इस तरह दिखता है: 'नई com.company.ui.EntityIDKey (c.companyId, c.name) कंपनी सी से चुनें जहां c.companyId शून्य नहीं है और c.name शून्य और लंबाई नहीं है (trim (c.name))> 0 क्रम से क्रमबद्ध करें। मैं एक टाइपेडक्वियर का उपयोग निम्नानुसार कर रहा हूं: 'सूची कंपनियां = getEntityManager()। CreateQuery (sql, EntityIDKey.class) .getResultList(); ' –

+1

यह स्थिति हो सकती है यदि आपकी EntityIDKey एक इकाई नहीं है। प्रदाता ऐसे प्रश्नों का समर्थन नहीं करने के लिए स्वतंत्र है। क्या आपने नियमित प्रश्न का उपयोग करने की कोशिश की है? – kostja

+0

जो सच है, 'EntityIDKey' एक इकाई नहीं है। मैं हाइबरनेट प्रदाता का उपयोग कर रहा हूं और किसी भी तरह से माना जाता है कि यह काम करेगा। एक नियमित क्वेरी जो 'कंपनी' का संग्रह बनाता है ठीक काम करता है। –

8

नया कोड इस तरह दिखता है। आपकी मदद के लिए धन्यवाद।

TypedQuery<CommUsed> q = em.createQuery(
     "SELECT new CommUsed(c.id,COUNT(t.id)) " + 
     "FROM PubText t " + 
     "JOIN t.comm c " + 
     "WHERE c.element = ?1 " + 
     "GROUP BY c.id", CommUsed.class); 
    q.setParameter(1, e); 
    HashMap<Long, Long> res = new HashMap<Long, Long>(); 
    for (CommUsed u : q.getResultList()) 
     res.put(u.commID, u.cnt); 
+0

मुझे लगता है, तो आप सभी के बाद TypedQueries का उपयोग कर सकते हैं :) जानना अच्छा है। दुर्भाग्य से क्वेरी से 'मानचित्र' को भरने का कोई उचित तरीका नहीं लगता है, इसलिए पिछले 3 लाइनों में परिवर्तन भाग को रहना है, मुझे डर है। – kostja

+1

आच, वह ठीक है। हमें पुराने सी दिनों में एक पंक्ति में सबकुछ दबाए जाने की आवश्यकता नहीं है। :-) –

+0

@ हसन टंकेके आपने @ कोस्टजा द्वारा सुझाए गए कन्स्ट्रक्टर अभिव्यक्ति सुविधा का लाभ क्यों नहीं लिया? –