2013-03-11 21 views
5

Quando uso list() di Hibernate (HQL) dopo createQuery(), allora voglio digitare direttamente cast List<Object[]> sul mio List<POJO class>. Descrivo il mio scenario attuale qui. Ho 3 Plain Old Java Objects dire Persona, Operation e Project e una tabella dice Transaction con riferimenti stranieri a Person, Operation e Project.Hibernate HQL createQuery() lista() cast per modellare direttamente

class Person { 
    String name; 
    // getters and setters 
} 

class Operation { 
    String name; 
    // getters and setters 
} 

class Project { 
    String name; 
    // getters and setters 
} 

class Transaction { 
    String p_id; 
    String o_id; 
    String project_id; 
    // refers to id of All three table above 
} 

Ora, voglio eseguire una query di Hibernate Query Language dire String query="select p.name, o.name, project.name from Person p , Operation o, Project project , Transaction t where p.id=2 and p.id=t.p_id and o.id=t.o_id and project.id=t.project_id".

Ho creato una classe Model per l'output di questa query, dice POP_Model.

private class POP_Model { 
    String person_name; 
    String operation_name; 
    String project_name; 
} 

Ora, voglio usare query di Hibernate:

Session session=HibernateConnection.getSessionFactory().openSession(); 
Query q=session.createQuery(query); 
List<POP_Model> list=(List<POP_Model>)q.list(); 

Dà errore typecast dicendo Object [] non può essere convertito in POP_Model. Ho controllato TypedQuery ma non ho avuto un esempio per questo. Ma per quanto ne so, TypedQuery può essere usato per mappare a POJO non a Modello. Voglio digitare direttamente cast in Model.

+0

Uno degli approcci per risolvere il problema è passare all'API dei criteri. –

+0

"Criteri Api" significa? puoi fare riferimento a qualsiasi link per questo. – Misha

risposta

6

Se siete OK con utilizzando l'API JPA (che Hibernate implementa pure) al posto delle API Hibernate per questo, è possibile utilizzare JPQL query costruttore:

List<DTO> dtos = entityManager.createQuery("SELECT NEW com.example.DTO(p.name, o.name) FROM Entity o").getResultList(); 

EDIT Esso si presenta come strumenti di Hibernate espressioni costruttore con esso API normale così:

List<DTO> dtos = session.createQuery("SELECT NEW com.example.DTO(p.name, o.name) FROM Entity o").list(); 

EDIT2 APP è uno standard Java EE, unificando lavorando con diverse librarie persistenza s come Hibernate e EclipseLink. Il oracle tutorial è abbastanza decente.

È possibile recuperare un EntityManager in un'applicazione non-EE come questo:

@PersistenceUnit 
    private EntityManagerFactory emf; 
    ... 
    EntityManager em = emf.createEntityManager(); 
+0

Mi sono imbattuto in API JPA per la prima volta. Potete suggerirmi buoni collegamenti di esempio JPA. Sto usando l'applicazione Struts 2. In secondo luogo, come posso ottenere l'oggetto entityManager? – Misha

+0

@Misha - hai aggiunto alcune detials, spero che possa aiutarti ulteriormente. IMO non dovresti impantanarti nell'apprendimento di una nuova API, l'ibernazione offre questa funzionalità in modo nativo, quindi per ora utilizzerei la versione di ibernazione, pensando a JPA in futuro. – kostja

+0

@@ kostja: grazie mille. Ho usato session.createQuery() e funziona con successo .. – Misha

3

Innanzitutto creare un costruttore della classe POJO.

private class POP_Model { 
    String person_name; 
    String operation_name; 
    String project_name; 

    public POP_Model(String person_name, String operation_name, String project_name){ 
     this.person_name = person_name; 
     this.operation_name = operation_name; 
     this.project_name = project_name; 
    } 
} 

Quindi è possibile utilizzare

select new com.server.dtos.POP_Model(p.name, o.name, project.name) 
from Transaction t INNER JOIN t.operation o 
INNER JOIN t.person p 
INNER JOIN t.project project 
where p.id=2 

Per riferimento, ecco la official documentation. Passare attraverso New object with HQL pure.

Problemi correlati