2012-05-31 9 views
7

devo albero di classi:Come restituire il tipo di oggetto anziché l'elenco <Object[]> in modalità di sospensione?

classA { 
     classB b; 
     classC c; ..... 
} 

ho interrogazione HQL come:

select a.field1, b.field2, c.field3, c.field4 from a left 
outer join b on a.id=b.fk  left outer join c on b.id=c.fk 

Questa query restituisce List. È possibile eseguire il cast utilizzando l'ibernazione ad es.

classD { 
    Type1 fiedl1; 
    Type2 field2; 
    Type3 field3; 
} 

quindi il casting verrà eseguito in stato di sospensione o è necessario eseguire manualmente tutte le operazioni di fusione? Grazie.

+0

'selezionare a da un join esterno sinistro b su a.id = b.fk join esterno sinistro c su b.id = c.fk' È questo ciò che stai cercando? – nullpotent

+1

Nessuna query restituisce l'elenco , ma desidero che la query restituisca l'elenco user810430

+0

http://stackoverflow.com/questions/18361558/java-math-biginteger-cannot-be-cast-to-java-lang-long – gavenkoa

risposta

22

Ci sono diversi tipi di seleziona nelle query JPA. Attualmente stai usando Array come tipo di ritorno, quello che ti serve è Costruisci il tipo di ritorno. Ecco come raggiungere questo obiettivo:

String queryStr = 
    "select NEW package.YourDefinedCustomClass(
    a.field1, b.field2, c.field3, c.field4) from a left outer join b 
    on a.id=b.fk left outer join c on b.id=c.fk"; 

TypedQuery<YourDefinedCustomClass> query = 
    em.createQuery(queryStr, YourDefinedCustomClass.class); 

List<YourDefinedCustomClass> results = query.getResultList(); 

Fondamentalmente ci sono due cose:

  1. classe personalizzata deve essere i risultati di ritorno Tipo
  2. classe personalizzata deve avere un costruttore che prende valori dei risultati tu definisci nella stringa di query.

Read more on selects in JPA2 queries.

+0

Grazie per la risposta accurata! Giusto per rendere la risposta ancora più precisa, vorrei sottolineare che il nome del costruttore deve essere pienamente qualificato e [le parole riservate nel nome del pacchetto possono causare problemi] (http://stackoverflow.com/questions/30891824) . – naXa

+0

Sto usando il contratto di sessione condivisa, quindi non ho l'oggetto 'entityManager'. Ad ogni modo per aggirare questo? – MarceloBarbosa

1

Se sei veramente sicuro di poter fare cast di tipi.

List<classD> newlist = ...; 
for(Object o : list){ 
     newlist.add((classD) o); 
} 

stare attenti con questo, però

Quindi sì. Colata manuale. (Nota: con gli array (si può lanciare direttamente))

+0

Isnt list is type of List ? Non capisco, la tua risposta. – JMelnik

2

È possibile utilizzare TypedQuery

TypedQuery<ClassA> q = em.createQuery("select a from a left outer join b on a.id=b.fk left outer join c on b.id=c.fk", ClassA.class); 
List<ClassA> res = q.getResultList(); 
+1

Questo tipo di ritorno funziona solo per selezioni a valore singolo. La documentazione JPA dice: 'L'elenco di selezione della query deve contenere solo un singolo elemento, che deve essere assegnabile al tipo specificato dall'argomento resultClass'. E le fonti di ibernazione dicono "Impossibile creare TypedQuery per la query con più di un risultato usando il tipo di risultato richiesto [" + resultClass.getName() + "]" '.Fondamentalmente genererà IllegalArgumentException - se la stringa di query non è valida o se il risultato della query non è assegnabile al tipo specificato – JMelnik

+0

Bene, il mio HQL sembra a posto. Hai ragione su tutto. – nullpotent

0

ho avuto lo stesso problem..i ha scritto questa query

Query sqlquery = session.createQuery("select c.courseName,f.facultyID,f.facultyName,f.facultyEmailID,f.facultyContactNo,s.subjectName from com.bean.CourseBean as c,com.bean.FacultyBean as f,com.bean.Faculty_SubjectBean as fs,com.bean.SubjectBean as s where f.facultyID=fs.facultyBean.facultyID AND s.subjectID=fs.subjectBean.subjectID AND c.courseID=f.courseBean.courseID AND collegeid=1"); 

e sono tornato elenco di oggetti e in servlet ho scritto,

java.util.List objList = objFacultyService.listFaculty_sql (1);

java.util.List<Temp> objtemp = new ArrayList<Temp>() ; 
for (Object[] objects : objList) 
{ 


     Temp temp = new Temp(); 
     temp.setFacultyEmailID(objects[3].toString()); 
     temp.setCourseName(objects[0].toString()); 
     if(objects[4]==null) 
     { 
      temp.setFacultyContactNo(1); 
     } 
     else 
     { 
        temp.setFacultyContactNo(Long.parseLong(objects[4].toString())); 
     } 
     temp.setFacultyID(Long.parseLong(objects[1].toString())); 
     temp.setFacultyName(objects[2].toString()); 
     temp.setSubjectName(objects[5].toString()); 
     objtemp.add(temp); 




} 
Problemi correlati