2012-05-31 9 views
7

Tengo árbol de clases:Cómo devolver el tipo de objeto en lugar de la Lista <Object[]> en hibernación?

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

tengo consulta HQL como:

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 

Esta consulta devuelve la lista. ¿Es posible emitir usando hibernación a, p.

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

manera de fundición se realizará mediante hibernación o de forma manual no necesita hacer todo fundición? Gracias.

+0

'seleccione una de una combinación externa izquierda b en a.id = b.fk combinación externa izquierda c en b.id = c.fk' ¿Es eso lo que está buscando? – nullpotent

+1

No. consulta devuelve Lista , pero me gustaría que la consulta devuelva Lista user810430

+0

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

Respuesta

22

Hay diferentes tipos de consultas selecciona en la APP. Actualmente utiliza Array como tipo de devolución, lo que necesita es Construir tipo de devolución. Aquí es cómo lograr esto:

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(); 

Básicamente hay dos cosas:

  1. clase personalizada debe ser sus resultados vuelven tipo
  2. clase personalizada debe tener un constructor que toma valores de los resultados usted define en cadena de consulta.

Read more on selects in JPA2 queries.

+0

¡Gracias por la respuesta precisa! Para que la respuesta sea aún más precisa, me gustaría señalar que el nombre del constructor debe estar totalmente calificado, y [las palabras reservadas en el nombre de su paquete pueden generar problemas] (http://stackoverflow.com/questions/30891824) . – naXa

+0

Uso el contrato de sesión compartida, por lo que no tengo el objeto 'entityManager'. De todos modos para solucionar esto? – MarceloBarbosa

1

Si usted está realmente seguro de que puede hacer moldes tipo.

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

tener cuidado con esto, sin embargo

Así que sí. Fundición manual. (Nota: con matrices (puede convertir directamente))

+0

¿No está lista el tipo de lista ? No lo entiendo, tu respuesta. – JMelnik

2

Usted puede utilizar 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

Este tipo de devolución funciona solo para selecciones de valor único. La documentación de JPA dice: 'La lista de selección de la consulta debe contener solo un elemento, que debe ser asignable al tipo especificado por el argumento resultClass'. Y las fuentes de hibernación dicen '" No se puede crear TypedQuery para consulta con más de un retorno usando el tipo de resultado solicitado ["+ resultClass.getName() +"] "'.Básicamente arrojará IllegalArgumentException - si la cadena de consulta no es válida o si el resultado de la consulta no se puede asignar al tipo especificado – JMelnik

+0

Bueno, mi HQL se ve bien. Tienes razón sobre todo. – nullpotent

0

tuve misma problem..i escribió esta consulta

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"); 

y yo regresamos lista de objeto y en el servlet que escribí,

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); 




} 
Cuestiones relacionadas