2011-09-29 16 views
16

के रूप में देशी क्वेरी परिणाम मैं इस तरह एक जेपीए 2.0 देशी क्वेरी चलाने:जेपीए 2.0 नक्शा

Query query = em.createNativeQuery("SELECT NAME, SURNAME, AGE FROM PERSON"); 
List list = query.getResultList(); 

अब list सभी पंक्तियों क्वेरी द्वारा रिटर्न है। मैं उन पर पुनरावृति कर सकते हैं, लेकिन हर प्रविष्टि एक Object[] जहां है:

  • सूचकांक 0 पर मैं NAME
  • इंडेक्स को 1 पर मैं उपनाम सूचकांक 3 में
  • खोजें मैं उम्र को खोजने

किसी को भी इस तरह कुछ करने के लिए एक तरह से मिला:

Map<String, Object> row = list.get(index); 
String name = row.get("NAME"); 
String surname = row.get("SURNAME"); 
Integer age = row.get("AGE"); 
,210

मैं देशी क्वेरी मैं निष्पादित कि एक गतिशील में से एक है और मैं SELECT खंड में क्षेत्र के आदेश पता नहीं है के बाद से इस की आवश्यकता होगी, तो मैं आईडी पता नहीं है क्वेरी तरह दिखेगा:

SELECT SURNAME, NAME, AGE FROM PERSON 

या

SELECT AGE, NAME, SURNAME FROM PERSON 

या यहाँ तक कि

SELECT AGE, SURNAME, NAME FROM PERSON 
+0

मानदंड क्वेरी? http://www.ibm.com/developerworks/java/library/j-typesafejpa/ – NimChimpsky

+0

मुझे ऐसा नहीं लगता, क्योंकि मुझे अभी भी व्यक्ति की आवश्यकता होगी। पीछे पीछे। जैसा कि मैंने कहा था कि एसक्यूएल क्यूरी गतिशील है और मैं वास्तव में नहीं जानता कि यह कैसा दिखता है। – kovica

उत्तर

10

कौन सा जेपीए प्रयोग कर रहे हैं - हाइबरनेट, EclipseLink या कुछ और?

जेपीए में ऐसा करने का कोई मानक तरीका नहीं है लेकिन आपका विशिष्ट कार्यान्वयन इसकी अनुमति दे सकता है - उदाहरण के लिए, एक्लीपसेलिंक के पास एक क्वेरी परिणाम प्रकार संकेत है।

http://dev.eclipse.org/mhonarc/lists/eclipselink-users/msg03013.html

Query query = entityManager.createNativeQuery(sql); 
query.setHint(QueryHints.RESULT_TYPE, ResultType.Map); 

हाइबरनेट के लिए, javax.persistence.Query dbQuery साथ:

org.hibernate.Query hibernateQuery =((org.hibernate.jpa.HibernateQuery)dbQuery) 
.getHibernateQuery(); 
hibernateQuery.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE); 
+2

ऐसा लगता है हाइबरनेट इस तरह के एक संकेत :( – chrismarx

+2

यह मेरे लिए काम कर रहा है इस तरह देशी क्वेरी का उपयोग नहीं है: 'NativeQueryImpl nativeQuery = (NativeQueryImpl) क्वेरी;' ' nativeQuery.setResultTransformer (AliasToEntityMapResultTransformer.INSTANCE);' ' सूची <मानचित्र <स्ट्रिंग, ऑब्जेक्ट >> परिणाम = query.getResultList(); ' ' मानचित्र <स्ट्रिंग, ऑब्जेक्ट> पंक्ति = result.get (0); ' स्ट्रिंग मान = (स्ट्रिंग) row.get (" NAME ") ; –

2

इस मैं जब परियोजना है कि मैं सभी जेपीए सुविधाओं का उपयोग नहीं कर सकता है पर काम कर रहा यह मिल गया पर एक नजर डालें इसलिए मैंने परंपरागत जेडीबीसी विधि की कोशिश की, भले ही मैं इसकी अनुशंसा नहीं करता लेकिन यह मेरे लिए काम कर रहा है।

@LocalBean 
public class TCotisationEJB { 

    @PersistenceContext(unitName="ClaimsProjectPU") 
    private EntityManager em; 

    @TransactionAttribute(TransactionAttributeType.NEVER) 
    public List getCotisation(){ 
     Query query=em.createNativeQuery("select Annee,Mois,RetSonarwa from TCotisMIFOTRA2008 where matricule='10000493' order by Annee"); 
     List<Object[]> cotisation=query.getResultList(); 
     Object[] cotisationData; 

     for(int i=0;i<cotisation.size();i++){ 
       cotisationData=cotisation.get(i); 

      System.out.print("Annee: "+cotisationData[0]+" Mois :"+cotisationData[1]+" Amount  :"+cotisationData[2]+"\n"); 

    } 
    return query.getResultList(); 
    }  
} 
+1

यह वही है जो ओपी बदलना चाहता है। – bargoras

1

अन्य पहले से ही उल्लेख किया है, पुराने JPA इसका समर्थन नहीं करता, फिर भी मैं अपने स्थिति में Postgres 9.4 साथ वैकल्पिक हल समाधान है, जबकि Jackson साथ काम करना,

List<String> list = em.createNativeQuery("select cast(json_object_agg(c.config_key,c.config_value) as text) from myschema.configuration c") 
        .getResultList(); 

नीचे बीन परत उपयोग में इसका इस्तेमाल करने के लिए विधि, अन्यथा सीधे वापस आती है।

//handle exception here, this is just sample 
Map map = new ObjectMapper().readValue(list.get(0), Map.class); 

कुछ और जेसन फ़ंक्शन, https://www.postgresql.org/docs/9.4/static/functions-json.html। मुझे यकीन है कि आप अन्य डेटाबेस के लिए भी मिल सकते हैं।

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